如何将TestApp类添加到Tkinter的Business标签页中?
可行性说明
完全可行,Tkinter没有限制将自定义Frame子类添加到ttk.Notebook的标签页中,只要正确设置组件的父容器关联即可。
原代码的问题
你的现有代码无法实现预期效果,问题出在TestApp类的初始化逻辑:
- 调用
Frame.__init__(self)时没有传入parent参数,导致这个Frame会默认创建一个新的顶层窗口(而不是嵌入到目标标签页) - 后续设置
self.main.geometry、self.main.title都是针对这个新窗口的,和你要嵌入的Business标签页无关
修正后的代码
from tkinter import* import random import time from tkinter import ttk from pandastable import Table, TableModel root = Tk() root.geometry("1000x800+0+0") tabControl = ttk.Notebook(root) tab1 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl) tab3 = ttk.Frame(tabControl) tabControl.add(tab1, text='Recommendation') tabControl.add(tab2, text='Business') tabControl.add(tab3, text='Customer') class TestApp(Frame): def __init__(self, parent=None): # 关键:将parent传入Frame的初始化方法,让当前Frame成为parent的子组件 Frame.__init__(self, parent) self.parent = parent # 不需要创建新窗口,直接用当前Frame作为容器 self.pack(fill=BOTH, expand=1) f = Frame(self) f.pack(fill=BOTH, expand=1) df = None self.table = pt = Table(f, dataframe=df, showtoolbar=True, showstatusbar=True) pt.show() # 创建TestApp实例,将tab2作为父容器,然后让它填充整个标签页 dataframe = TestApp(tab2) dataframe.pack(fill=BOTH, expand=1) tabControl.pack(expand=50, fill="both") root.mainloop()
关键修改点
TestApp初始化时,将parent传递给Frame.__init__(self, parent),确保它是目标标签页的子组件- 移除了针对新窗口的
geometry和title设置,因为嵌入组件不需要这些顶层窗口属性 - 创建
TestApp实例时传入tab2作为父容器,并通过pack(fill=BOTH, expand=1)让它填充整个标签页
内容的提问来源于stack exchange,提问作者theslasher
相关产品推荐
相关产品推荐

