Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Tkinter中的另一个选项卡更改选项卡小部件_Python_Python 3.x_Tkinter - Fatal编程技术网

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)
    ,与连接其他频道的方式相同。您可以创建class
    MyTab
    ,并在第二个选项卡中将第一个选项卡作为参数。那个么笔记本应该也会告诉你们哪个标签是正确的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
    似乎对创建自己的小部件最有用,它将保留许多其他小部件。