【问题标题】:Access specific ttk.Notebook tab from another class从另一个类访问特定的 ttk.Notebook 选项卡
【发布时间】:2021-12-25 05:31:05
【问题描述】:

我在一个文件中有两个类,一个用于主 gui,另一个用于小设置 gui。

from tkinter import *
import tkinter as tk

class Class1:
    def __init__(self, mainwindow):
        self.mainwindow = mainwindow
        self.mainwindow.title("Assistant")
        self.mainwindow.geometry("550x400")

        # -- MenuBar --
        MenuBar = Menu(self.mainwindow)

        # FirstMenu
        FirstMenu = Menu(MenuBar, tearoff=False)
        FirstMenu.add_command(label="Settings", command=self.OpenInfo)
    
        self.mainwindow.config(menu=MenuBar)

    def OpenInfo(self):
        self.OpenSettings = Toplevel(self.mainwindow)
        self.app = SettingsGUI(self.OpenSettings)


        # -- MISSING CODE HERE --



class SettingsGUI:
    def __init__(self, settingswindow):
        self.settingswindow = settingswindow
        self.settingswindow.title("Settings")
        self.settingswindow.geometry("300x250")
        
        self.settingswindow.grab_set()


        def close_windows(self):
            self.settingswindow.release_set()
            self.settingswindow.destroy()

        SettingsFrame = Frame(self.settingswindow, bg="yellow")
        SettingsFrame.pack(fill=tk.BOTH, side=TOP, expand=True)
        
        SettingsTab = ttk.Notebook(SettingsTabFrame)
        
        PreferencesTab = ttk.Frame(SettingsTab)
        SettingsTab.add(PreferencesTab, text='Preferences')

        AppearanceTab = ttk.Frame(SettingsTab)
        SettingsTab.add(AppearanceTab, text='Appearance')

        InfoTab = ttk.Frame(SettingsTab)
        SettingsTab.add(InfoTab, text='Info')



def main():
    mainwindow = tk.Tk()
    app = Class1(mainwindow)
    mainwindow.mainloop()


if __name__ == '__main__':
    main()

我不知道要在OpenInfo 命令中添加什么,不仅可以打开SettingsGUI,还可以打开@987654325 的特定选项卡(第三个,InfoTab) @.
我知道 ttk Notebook 的 select 功能,但我真的不知道如何从一个类到另一个类。

--------------- 编辑:--------------- ------------

我在一个文件中有两个类,一个用于主 gui,另一个用于小设置 gui。

    import tkinter as tk
    from tkinter import ttk
    
    class AssistantGUI:
        def __init__(self, mainwindow):
            self.mainwindow = mainwindow
            self.mainwindow.title("Assistant")
            self.mainwindow.geometry("550x400")
    
            # -- MenuBar --
            MenuBar = tk.Menu(self.mainwindow)
    
            # FirstMenu
            FirstMenu = tk.Menu(MenuBar, tearoff = False)
            # added this
            MenuBar.add_cascade(label = "Open", menu = FirstMenu)
            FirstMenu.add_command(label = "Settings", command = self.OpenSettings)
            FirstMenu.add_command(label = "Info", command = self.OpenInfo)
        
            self.mainwindow.config(menu=MenuBar)
    
        def OpenSettings(self):
            self.OpenSettings = tk.Toplevel(self.mainwindow)
            self.app = SettingsGUI(self.OpenSettings)

        def OpenInfo(self):
            self.OpenSettings = tk.Toplevel(self.mainwindow)
            self.app = SettingsGUI(self.OpenSettings)
            # -- MISSING CODE HERE TO SELECT INFOTAB --
    
    class SettingsGUI:
        def __init__(self, settingswindow):
            self.settingswindow = settingswindow
            self.settingswindow.title("Settings")
            self.settingswindow.geometry("300x250")
            
            self.settingswindow.grab_set()
    
            def close_windows(self):
                self.settingswindow.destroy()
    
            SettingsFrame = tk.Frame(self.settingswindow, bg = "yellow")
            SettingsFrame.pack(fill = tk.BOTH, side = tk.TOP, expand = True)
            # changed this from SettingsTabFrame
            SettingsTab = ttk.Notebook(SettingsFrame)
            
            PreferencesTab = ttk.Frame(SettingsTab)
            SettingsTab.add(PreferencesTab, text = 'Preferences')
    
            AppearanceTab = ttk.Frame(SettingsTab)
            SettingsTab.add(AppearanceTab, text = 'Appearance')
    
            InfoTab = ttk.Frame(SettingsTab)
            SettingsTab.add(InfoTab, text = 'Info')
    
            # added these
            SettingsTab.pack(fill = tk.BOTH, side = tk.TOP, expand = True)
           
            # Force focus on settingswindow
            SettingsTab.focus_force()
    
    def main():
        mainwindow = tk.Tk()
        app = AssistantGUI(mainwindow)
        mainwindow.mainloop()
    
    if __name__ == '__main__':
        main()

我不知道要在OpenInfo 命令中添加什么,不仅可以打开SettingsGUI,还可以打开@987654330 的特定选项卡(第三个,InfoTab) @.
我知道 ttk Notebook 的 select 功能,但我真的不知道如何从一个类到另一个类。

【问题讨论】:

    标签: python user-interface tkinter ttk


    【解决方案1】:

    我对您的代码做了一些更改。

    代码在相关位置插入了注释,详细说明了所有更改。

    主要是SettingsTab.select(InfoTab) 和 'SettingsTab.pack(...`

    您的菜单也需要使用add_cascade 进行调整。

    import tkinter as tk
    from tkinter import ttk
    
    # changed this from Class1
    class AssistantGUI:
        def __init__(self, mainwindow):
            self.mainwindow = mainwindow
            self.mainwindow.title("Assistant")
            self.mainwindow.geometry("550x400")
    
            # -- MenuBar --
            MenuBar = tk.Menu(self.mainwindow)
    
            # FirstMenu
            FirstMenu = tk.Menu(MenuBar, tearoff = False)
            # added this
            MenuBar.add_cascade(label = "Open", menu = FirstMenu)
            FirstMenu.add_command(label = "Settings", command = self.OpenInfo)
        
            self.mainwindow.config(menu=MenuBar)
    
        def OpenInfo(self):
            self.OpenSettings = tk.Toplevel(self.mainwindow)
            self.app = SettingsGUI(self.OpenSettings)
    
            # -- MISSING CODE HERE --
    
    class SettingsGUI:
        def __init__(self, settingswindow):
            self.settingswindow = settingswindow
            self.settingswindow.title("Settings")
            self.settingswindow.geometry("300x250")
            
            self.settingswindow.grab_set()
    
            def close_windows(self):
                # removed grab_release
                self.settingswindow.destroy()
    
            SettingsFrame = tk.Frame(self.settingswindow, bg = "yellow")
            SettingsFrame.pack(fill = tk.BOTH, side = tk.TOP, expand = True)
            # changed this from SettingsTabFrame
            SettingsTab = ttk.Notebook(SettingsFrame)
            
            PreferencesTab = ttk.Frame(SettingsTab)
            SettingsTab.add(PreferencesTab, text = 'Preferences')
    
            AppearanceTab = ttk.Frame(SettingsTab)
            SettingsTab.add(AppearanceTab, text = 'Appearance')
    
            InfoTab = ttk.Frame(SettingsTab)
            SettingsTab.add(InfoTab, text = 'Info')
    
            # added these
            SettingsTab.pack(fill = tk.BOTH, side = tk.TOP, expand = True)
            # focus on InfoTab
            SettingsTab.select(InfoTab)
            # Force focus on settingswindow
            SettingsTab.focus_force()
    
    def main():
        mainwindow = tk.Tk()
        app = AssistantGUI(mainwindow)
        mainwindow.mainloop()
    
    if __name__ == '__main__':
        main()
    

    如果您想在 OpenInfo 中保持控制权,请像这样进行更改。

        def OpenInfo(self):
            self.OpenSettings = tk.Toplevel(self.mainwindow)
            self.app = SettingsGUI(self.OpenSettings)
            # focus on InfoTab
            self.app.SettingsTab.select(self.app.InfoTab)
            # Force focus on settingswindow
            self.app.SettingsTab.focus_force()
    

    您必须在 SettingsTabInfoTab 前面加上“self”来更改它们。

    【讨论】:

    • 是否可以将 select(InfoTab) 添加到 OpenInfo 命令本身?因为在原始代码中,我使用另一个命令从第一个选项卡显示设置 gui,但我想要另一个命令从 settingsGUI 打开 InfoTab。抱歉,我之前必须更好地指定它。
    • 是的,有可能,我已经更新了我的答案以包含这个。
    • 每次报错:self.app.SettingsTab.select(self.app.InfoTab) AttributeError: 'SettingsGUI' object has no attribute 'SettingsTab'
    • 当你声明SettingsTab 时,将self.SettingsTabInfoTab 一样应该是self.InfoTab
    • 伙计,我以前试过但我得到了同样的错误,我现在又试了一次,它工作了!!非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多