提问人:Chris W 提问时间:11/12/2023 最后编辑:acw1668Chris W 更新时间:11/13/2023 访问量:34
选项卡的动态填充
Dynamic population of tabs
问:
我有一个可以更改的选项卡名称列表,因此我想遍历名称并创建选项卡。从这些按钮中,我想放置各种按钮,这些按钮根据用户单击的选项卡而有所不同。我的问题是我的选项卡无法加载。如果我删除该命令,我的窗口会使用正确的选项卡正常加载。
我的代码:
import tkinter as tk
from tkinter import ttk
def loadtab(event):
selection = event.widget.select()
tabN = event.widget.tab(selection, "text")
t_nos=str(uFrame.index(uFrame.select())+1)
tab = f'tab{t_nos}'
if tabN == 'Ed':
tk.Button(tab, text=tabN).pack()
elif tabN == 'Ted':
tk.Button(tab, text=tabN).pack()
root = tk.Tk()
root.title("Tab")
uFrame = ttk.Notebook(root, style="TFrame") #Create notebook
uFrame.pack(pady=20)
uFrame.bind("<<NotebookTabChanged>>", loadtab) #Bind notebook so that when it is changed, it loads items onto each tab
pathOpt = ['Ed', 'Ted'] #Tab names
tNo = 0 #Counter
for name in pathOpt: #parse through tab names and create tabs
tab = f'tab{tNo + 1}'
tab = ttk.Frame(uFrame)
uFrame.add(tab, text=pathOpt[tNo])
tNo += 1
test = tk.Button(root, text='Deliniate tabs') # placeholder to show where tabs are
test.pack(pady=20)
root.mainloop()
结果:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\cwade\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1948, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "C:\PyProjects\TemplateTool\TemplateToolV3_Tabs.py", line 12, in loadtab
tk.Button(tab, text=tabN).pack()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\cwade\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2707, in __init__
Widget.__init__(self, master, 'button', cnf, kw)
File "C:\Users\cwade\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2623, in __init__
self._setup(master, cnf)
File "C:\Users\cwade\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2592, in _setup
self.tk = master.tk
^^^^^^^^^
AttributeError: 'str' object has no attribute 'tk'
我已经打印了各种名称等,并发现选项卡名称是正确的,但我仍然收到错误。
答:
0赞
acw1668
11/13/2023
#1
在里面,你给变量分配一个字符串,然后用它作为新创建的按钮的父级。它会导致异常。loadtab()
tab
您需要使用以下命令获取帧的实例:.nametowidget()
def loadtab(event):
# selection is the name of the frame
selection = event.widget.select()
tabN = event.widget.tab(selection, "text")
#t_nos=str(uFrame.index(uFrame.select())+1)
#tab = f'tab{t_nos}'
# get the instance of the frame using .nametowidget()
tab = event.widget.nametowidget(selection)
tk.Button(tab, text=tabN).pack()
评论
0赞
Chris W
11/14/2023
谢谢acw1668,这很有效。我明白我做错了什么。干杯。
评论