使用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()
问题排查与解决建议
清洗串口数据
串口读取的self.string.split(' ')[7]可能包含换行符或空白字符,导致表格渲染错位。添加数据时做清洗:self.places["Best Lap"].append(self.best[self.i-1].strip())修复线程调用错误
当前threading.Thread(target=self.LeaderBoard()).start()会直接执行方法,而非将方法作为线程目标,正确写法:threading.Thread(target=self.LeaderBoard).start()避免重复创建表格
每次调用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()优化列名兼容性
带空格的列名「Best Lap」可能导致渲染宽度计算异常,可重命名列:self.stats = pd.DataFrame.from_dict(self.places).rename(columns={"Best Lap": "BestLap"})
内容的提问来源于stack exchange,提问作者Noah Robb
相关产品推荐
相关产品推荐

