用小部件填充 tkinter notebook 选项卡中的各个框架(自动生成选项卡后)
filling individual frames in tkinter notebook Tabs with widgets (after automatic tab generation)
我找到了一种方法,可以轻松地使用 ttk 笔记本自动生成多个选项卡。作为 "solution" 至:
但是现在我在用单独的内容(即小部件)填充选项卡时遇到了问题。我需要什么“???”在注释掉的部分?
如果你告诉我如何解决这个问题,我将不胜感激。
from tkinter import *
from tkinter import ttk
###
class MyTab(Frame):
def __init__(self, root, name):
Frame.__init__(self, root)
self.root = root
self.name = name
###
class Application():
def __init__(self):
self.tabs = {'ky': 1}
print(self.tabs['ky'])
self.root = Tk()
self.root.minsize(300, 300)
### Tab generation
self.notebook = ttk.Notebook(self.root, width=800, height=550)
tab_names = ["info", "S00", "S01", "S02", "S03", "S04", "S05", "S06", "S07", "S08", "help"]
for i in range(0, len(tab_names)):
tab = MyTab(self.notebook, tab_names[i])
self.notebook.add(tab, text=tab_names[i])
self.button = Button(self.root, text='next ->', command=self.next_Tab).pack(side=BOTTOM)
### info Tab Widgets
#self.btn1 = Button(???, text='Info Button', command=self.next_Tab).pack(side=RIGHT)
### S00 Tab Widgets
#self.btn2 = Button(???, text="test_btn")
#self.btn2.pack()
### S01 Tab Widgets and so on...
self.notebook.pack(side=TOP)
def next_Tab(self):
print("next Tab -> not yet defined")
def run(self):
self.root.mainloop()
###
Application().run()
规则很简单:要将一个小部件放在另一个小部件中,您需要引用另一个小部件。在你的情况下,简单的事情就是创建一个字典来保存对你的框架的引用:
tabs = {}
for i in range(0, len(tab_names)):
tab = MyTab(self.notebook, tab_names[i])
self.notebook.add(tab, text=tab_names[i])
tabs[tab_names[i]] = tab
...
self.btn1 = Button(tabs["info"], ...)
顺便说一句,您可以通过直接遍历选项卡名称列表而不是遍历索引值来使循环更具可读性(以及更多 "pythonic"):
tabs = {}
for tab_name in tab_names:
tab = MyTab(self.notebook, tab_name)
self.notebook.add(tab, text=tab_name)
tabs[tab_name] = tab
我找到了一种方法,可以轻松地使用 ttk 笔记本自动生成多个选项卡。作为 "solution" 至: 但是现在我在用单独的内容(即小部件)填充选项卡时遇到了问题。我需要什么“???”在注释掉的部分? 如果你告诉我如何解决这个问题,我将不胜感激。
from tkinter import *
from tkinter import ttk
###
class MyTab(Frame):
def __init__(self, root, name):
Frame.__init__(self, root)
self.root = root
self.name = name
###
class Application():
def __init__(self):
self.tabs = {'ky': 1}
print(self.tabs['ky'])
self.root = Tk()
self.root.minsize(300, 300)
### Tab generation
self.notebook = ttk.Notebook(self.root, width=800, height=550)
tab_names = ["info", "S00", "S01", "S02", "S03", "S04", "S05", "S06", "S07", "S08", "help"]
for i in range(0, len(tab_names)):
tab = MyTab(self.notebook, tab_names[i])
self.notebook.add(tab, text=tab_names[i])
self.button = Button(self.root, text='next ->', command=self.next_Tab).pack(side=BOTTOM)
### info Tab Widgets
#self.btn1 = Button(???, text='Info Button', command=self.next_Tab).pack(side=RIGHT)
### S00 Tab Widgets
#self.btn2 = Button(???, text="test_btn")
#self.btn2.pack()
### S01 Tab Widgets and so on...
self.notebook.pack(side=TOP)
def next_Tab(self):
print("next Tab -> not yet defined")
def run(self):
self.root.mainloop()
###
Application().run()
规则很简单:要将一个小部件放在另一个小部件中,您需要引用另一个小部件。在你的情况下,简单的事情就是创建一个字典来保存对你的框架的引用:
tabs = {}
for i in range(0, len(tab_names)):
tab = MyTab(self.notebook, tab_names[i])
self.notebook.add(tab, text=tab_names[i])
tabs[tab_names[i]] = tab
...
self.btn1 = Button(tabs["info"], ...)
顺便说一句,您可以通过直接遍历选项卡名称列表而不是遍历索引值来使循环更具可读性(以及更多 "pythonic"):
tabs = {}
for tab_name in tab_names:
tab = MyTab(self.notebook, tab_name)
self.notebook.add(tab, text=tab_name)
tabs[tab_name] = tab