Pandastable封装到自定义tk.Frame类后新窗口无法显示表格如何解决
修复方案
问题根源
你的代码问题出在DataTable组件的父容器绑定逻辑错误:
- 组件初始化时没有将传入的父容器参数传给tk.Frame的构造方法,导致所有
DataTable实例默认挂载到第一个创建的根窗口(主窗口) - 表格容器直接绑定到全局的
master属性,和你实例化DataTable时传入的父容器完全无关 - 多窗口场景下错误使用多个
Tk()实例,会导致组件归属、消息循环异常
需修改的核心点
- 弹出窗使用
tk.Toplevel()创建,不要重复创建Tk()实例 DataTable初始化时明确传入父容器给父类构造方法- 表格容器挂载到当前
DataTable实例自身,不要使用全局master
修复后完整代码
from pandastable import Table import pandas as pd import tkinter as tk df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]}) class DataTable(tk.Frame): """Basic frame for the Table""" def __init__(self, parent=None, df=None, *args, **kwargs): # 明确将父容器传给Frame构造方法,确定组件归属 super().__init__(parent, *args, **kwargs) # 表格容器挂载到当前DataTable实例 f = tk.Frame(self) f.pack(fill=tk.BOTH, expand=1) self.table = pt = Table( f, dataframe=df, showtoolbar=True, showstatusbar=True) pt.show() def new_window(): # 弹出窗用Toplevel,不要新建Tk实例 root1 = tk.Toplevel() root1.geometry('600x400') frame11 = tk.Frame(root1) frame11.pack(fill=tk.BOTH, expand=1) # 明确传入父容器 frame12 = DataTable(parent=frame11, df=df) frame12.pack(fill=tk.BOTH, expand=1) root = tk.Tk() root.geometry('600x400') frame = tk.Frame(root) frame.pack(fill=tk.BOTH, expand=1) frame1 = tk.Frame(frame) frame1.pack() button = tk.Button(frame1, text='Click Me', command=new_window) button.pack() frame2 = DataTable(parent=frame, df=df) frame2.pack(fill=tk.BOTH, expand=1) root.mainloop()
修改后点击按钮弹出的新窗口就会正确渲染表格,不会再出现在主窗口中。
内容的提问来源于stack exchange,提问作者Forklift17
相关产品推荐
相关产品推荐

