Python 从Tkinter中的另一个选项卡更改选项卡小部件
我正在基于所描述的结构使用Python 从Tkinter中的另一个选项卡更改选项卡小部件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在基于所描述的结构使用tkinter创建GUI。我有一些看起来相同但变量不同的选项卡。所以我决定为选项卡定义一个类,并将它们添加到主窗口中。我将从另一个选项卡在一个选项卡中配置一些小部件。在第11行中,定义了一个函数,当单击tab_2中的按钮时,tab_1的按钮背景色变为绿色。鉴于其有效性,我有两个问题: 是否可以不将channel_1定义为main_窗口的属性?我认为必须有更好的方法来做到这一点,特别是,如果GUI将被用作模块(那么将不定义main_window) 是否可能知道哪个选项卡处
tkinter
创建GUI。我有一些看起来相同但变量不同的选项卡。所以我决定为选项卡定义一个类,并将它们添加到主窗口中。我将从另一个选项卡在一个选项卡中配置一些小部件。在第11行中,定义了一个函数,当单击tab_2
中的按钮时,tab_1
的按钮背景色变为绿色。鉴于其有效性,我有两个问题:
channel_1
定义为main_窗口的属性?我认为必须有更好的方法来做到这一点,特别是,如果GUI将被用作模块(那么将不定义main_window
)
将tkinter作为tk导入
从tkinter导入ttk
类通道(tk.Frame):
定义初始化(自、父、*args、**kwargs):
tk.Frame.\uuuuu init\uuuuuu(self,parent,*args,**kwargs)
self.parent=parent
self.btn=tk.Button(self.parent,text='click me',command=self.change_green)
self.btn.pack()
def更改_绿色(自):
主窗口.channel_1.btn.config(背景='green')#第11行
类main应用程序(tk.Frame):
定义初始化(自、父、*args、**kwargs):
tk.Frame.\uuuuu init\uuuuuu(self,parent,*args,**kwargs)
self.parent=parent
self.tab_control=ttk.Notebook(self.parent)
self.tab_1=ttk.Frame(self.tab_控件)
self.tab_2=ttk.Frame(self.tab_控件)
self.tab\u control.add(self.tab\u 1,text='tab 1')
self.tab\u control.add(self.tab\u 2,text='tab 2')
self.tab\u control.pack(fill='both',expand=1)
self.channel_1=通道(self.tab_1)
self.channel_2=通道(self.tab_2)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
main_window=MainApplication(root)#我将创建MyTab类,并将其小部件保留在这个类中,而不是通道中。它还可以保持对其他选项卡的访问,以便一个选项卡中的按钮可以更改其他选项卡中的颜色
import tkinter as tk
from tkinter import ttk
class MyTab(tk.Frame):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
#self.master = master # super() already set it
self.btn = tk.Button(self, text='click me', command=self.change_green)
self.btn.pack()
self.other_tab = None # default value at start
def change_green(self):
if self.other_tab:
# change color in other tab
self.other_tab.btn.config(bg = 'green')
# get active tab ID
print('active tab ID:', self.master.select())
# get button in active tab
active_tab = root.nametowidget(self.master.select())
print('active tab - btn text:', active_tab.btn['text'])
# get all tabs
print('all tabs:', self.master.children.items())
# set other tab as active
self.master.select(self.other_tab)
class MainApplication(tk.Frame):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
#self.master = master # super() already set it
self.tab_control = ttk.Notebook(self.master)
self.tab_1 = MyTab(self.tab_control)
self.tab_2 = MyTab(self.tab_control)
self.tab_1.other_tab = self.tab_2
self.tab_2.other_tab = self.tab_1
self.tab_control.add(self.tab_1, text = 'tab 1')
self.tab_control.add(self.tab_2, text = 'tab 2')
self.tab_control.pack(fill = 'both', expand = 1)
if __name__ == "__main__":
root = tk.Tk()
main_window = MainApplication(root)
main_window.pack(side="top", fill="both", expand=True)
root.mainloop()
使用选项卡的父级(self.master),我可以获得活动选项卡、所有选项卡的列表并激活其他选项卡
import tkinter as tk
from tkinter import ttk
class MyTab(tk.Frame):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
#self.master = master # super() already set it
self.btn = tk.Button(self, text='click me', command=self.change_green)
self.btn.pack()
self.other_tab = None # default value at start
def change_green(self):
if self.other_tab:
# change color in other tab
self.other_tab.btn.config(bg = 'green')
# get active tab ID
print('active tab ID:', self.master.select())
# get button in active tab
active_tab = root.nametowidget(self.master.select())
print('active tab - btn text:', active_tab.btn['text'])
# get all tabs
print('all tabs:', self.master.children.items())
# set other tab as active
self.master.select(self.other_tab)
class MainApplication(tk.Frame):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
#self.master = master # super() already set it
self.tab_control = ttk.Notebook(self.master)
self.tab_1 = MyTab(self.tab_control)
self.tab_2 = MyTab(self.tab_control)
self.tab_1.other_tab = self.tab_2
self.tab_2.other_tab = self.tab_1
self.tab_control.add(self.tab_1, text = 'tab 1')
self.tab_control.add(self.tab_2, text = 'tab 2')
self.tab_control.pack(fill = 'both', expand = 1)
if __name__ == "__main__":
root = tk.Tk()
main_window = MainApplication(root)
main_window.pack(side="top", fill="both", expand=True)
root.mainloop()
如果您在第二个频道中添加第一个频道作为参数,那么它可以在没有主窗口的情况下访问-频道(self.tab\u 2,self.channel\u 1)
,与连接其他频道的方式相同。您可以创建classMyTab
,并在第二个选项卡中将第一个选项卡作为参数。那个么笔记本应该也会告诉你们哪个标签是正确的active@furas但是change\u green
是Channel
的一种方法,self.tab\u 2
是一个框架对象,没有任务所需的方法和属性。至于我,你应该创建类MyTab而不是Channel。每个标签都应该在MyTab中包含所有的小部件,而不是在外部类通道中。非常感谢。您可以使用tab\u 1=MyTab(tab\u控件)
更改tab\u 1=ttk.Frame(tab\u控件)
的原因是MyTab
继承自tk.Frame
?这就是@Brian Oakley建议继承的原因?你可以使用任何小部件作为tab-tab_3=tk.Button(…)
-因此我可以使用任何小部件来创建MyTab
,但是Frame
似乎对创建自己的小部件最有用,它将保留许多其他小部件。