You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tkinter+pandastable开发排行榜时,最后列值显示位置异常

Pandastable最后一列数值错位问题排查与解决

使用tkinter和pandastable制作排行榜时,遇到核心问题:pandastable的最后一列始终错位显示数值,每一行的最后一列都存在该问题,手动输入数值也无法解决。从截图可见,「Best Lap」列的内容未正确对齐到列下方,出现偏移。


相关代码片段

空数据字典定义

self.places = {"Name":[], "Time":[], "Best Lap": []}

数据读取代码

def serialReading(self):   
    while(self.terminate == True):
            if(serialPort.in_waiting > 0):
                self.serialString = serialPort.readline()
                self.string = self.serialString.decode('Ascii')

                self.numbers = 0
                    
                try:
                    for self.i in range(len(self.frameIdentities)):
                        self.i+=1
                        if self.i == int(self.string.split(' ')[1]):
                            try:   
                                self.lapRemainingPeople['serialTime'+str(self.i-1)] -=1

                                self.BestLap = tk.CTkLabel(self.frameIdentities[self.i-1], text = str(self.string.split(' ')[7]))
                                self.laps = tk.CTkLabel(self.frameIdentities[self.i-1], text = str(self.string.split(' ')[4]))
                                self.lapsRem = tk.CTkLabel(self.frameIdentities[self.i-1], text=str(self.lapRemainingPeople['serialTime' + str(self.i-1)]), text_font=("Arial", 36))
                                
                                self.time[self.i-1] += int(self.string.split(' ')[4])
                                self.best[self.i-1] = self.string.split(' ')[7]

                                y = self.yCoordinates[self.i-1] + 30
                                self.lapsRem.place(x=65, y=y)
                                self.BestLap.place(x=0, y=140, width=65)
                                self.laps.place(x=0, y=80, width=65)

                                if self.lapRemainingPeople['serialTime'+str(self.i-1)] <= 0:
                                    if (str(self.names[self.i-1]) not in self.places['Name']): 
                                        self.time[self.i-1] /= 1000                    
                                        self.lapsRem.configure(text='0')
                                        self.places["Name"].append(self.names[self.i-1])
                                        self.places["Time"].append(self.time[self.i-1])
                                        self.places["Best Lap"].append(self.best[self.i-1])
                                        threading.Thread(target=self.LeaderBoard()).start()
                                    else:
                                        self.lapsRem.configure(text='0')

                            except:
                                pass

                except:
                    pass

表格显示代码

def LeaderBoard(self):
    if self.Truth == False:
        self.leaderboard = tk.CTkToplevel(window)
        self.statsFrame = tk.CTkFrame(self.leaderboard)
        self.statsFrame.pack()
        self.Truth = True
    self.leaderboard.update()
    self.stats = pd.DataFrame.from_dict(self.places)
    print(self.stats)
    self.table = Table(self.statsFrame, dataframe=self.stats)
    self.table.show()

问题排查与解决建议

  1. 清洗串口数据
    串口读取的self.string.split(' ')[7]可能包含换行符或空白字符,导致表格渲染错位。添加数据时做清洗:

    self.places["Best Lap"].append(self.best[self.i-1].strip())
    
  2. 修复线程调用错误
    当前threading.Thread(target=self.LeaderBoard()).start()会直接执行方法,而非将方法作为线程目标,正确写法:

    threading.Thread(target=self.LeaderBoard).start()
    
  3. 避免重复创建表格
    每次调用LeaderBoard()新建表格会导致渲染冲突,改为更新现有表格数据:

    def LeaderBoard(self):
        if self.Truth == False:
            self.leaderboard = tk.CTkToplevel(window)
            self.statsFrame = tk.CTkFrame(self.leaderboard)
            self.statsFrame.pack(fill='both', expand=True)
            self.stats = pd.DataFrame.from_dict(self.places)
            self.table = Table(self.statsFrame, dataframe=self.stats)
            self.table.show()
            self.Truth = True
        else:
            self.stats = pd.DataFrame.from_dict(self.places)
            self.table.updateModel(self.stats)
            self.table.redraw()
        self.leaderboard.update()
    
  4. 优化列名兼容性
    带空格的列名「Best Lap」可能导致渲染宽度计算异常,可重命名列:

    self.stats = pd.DataFrame.from_dict(self.places).rename(columns={"Best Lap": "BestLap"})
    

内容的提问来源于stack exchange,提问作者Noah Robb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:57:20