从另一个 class 访问特定的 ttk.Notebook 标签

Access specific ttk.Notebook tab from another class

我在一个文件中有两个 classes,一个用于主 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,还可以打开 特定的选项卡 (第三个, InfoTab) 的 SettingsGUI.
我知道 ttk Notebook 中的 select 函数,但我真的不知道如何使用它从 class 到另一个

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

我在一个文件中有两个 classes,一个用于主 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,还可以打开 特定的选项卡 (第三个, InfoTab) 的 SettingsGUI.
我知道 ttk Notebook 中的 select 函数,但我真的不知道如何使用它从 class 到另一个

我对你的代码做了一些修改。

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

主要的是 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.'