Python Tkinter 如何跨类选中ttk.Notebook的指定标签页
实现方案
要实现跨类切换ttk.Notebook的选中标签,只需要两步核心调整:
- 首先将SettingsGUI类中的Notebook组件设置为实例属性,让外部可以访问该组件
- 之后在主界面的OpenInfo方法中调用Notebook的select方法选中Info标签即可
具体修改点
- 调整SettingsGUI类的代码,将Notebook暴露为实例属性,可额外增加可选初始化参数指定默认打开的标签,提升复用性:
class SettingsGUI: # 增加default_tab可选参数,默认值为0即第一个标签 def __init__(self, settingswindow, default_tab=0): self.settingswindow = settingswindow self.settingswindow.title("Settings") self.settingswindow.geometry("300x250") self.settingswindow.grab_set() def close_windows(): self.settingswindow.destroy() SettingsFrame = tk.Frame(self.settingswindow, bg = "yellow") SettingsFrame.pack(fill = tk.BOTH, side = tk.TOP, expand = True) # 把局部变量SettingsTab改成实例属性self.SettingsTab,外部可访问 self.SettingsTab = ttk.Notebook(SettingsFrame) PreferencesTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(PreferencesTab, text = 'Preferences') AppearanceTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(AppearanceTab, text = 'Appearance') InfoTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(InfoTab, text = 'Info') self.SettingsTab.pack(fill = tk.BOTH, side = tk.TOP, expand = True) # 初始化时直接切换到指定标签 self.SettingsTab.select(default_tab) self.SettingsTab.focus_force()
- 修改主界面的OpenInfo方法,实例化SettingsGUI时传入第三个标签的索引(索引从0开始计数,Info是第三个所以索引为2):
def OpenInfo(self): self.OpenSettings = tk.Toplevel(self.mainwindow) # 传入default_tab=2即可默认打开Info标签页 self.app = SettingsGUI(self.OpenSettings, default_tab=2)
如果不想修改SettingsGUI的初始化参数,也可以在OpenInfo里直接调用实例的Notebook属性切换:
def OpenInfo(self): self.OpenSettings = tk.Toplevel(self.mainwindow) self.app = SettingsGUI(self.OpenSettings) # 直接调用SettingsGUI实例的Notebook属性的select方法,索引2对应Info标签 self.app.SettingsTab.select(2)
完整可运行修改后代码
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) 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.settings_win = tk.Toplevel(self.mainwindow) self.app = SettingsGUI(self.settings_win) def OpenInfo(self): self.settings_win = tk.Toplevel(self.mainwindow) self.app = SettingsGUI(self.settings_win, default_tab=2) class SettingsGUI: def __init__(self, settingswindow, default_tab=0): self.settingswindow = settingswindow self.settingswindow.title("Settings") self.settingswindow.geometry("300x250") self.settingswindow.grab_set() def close_windows(): self.settingswindow.destroy() SettingsFrame = tk.Frame(self.settingswindow, bg = "yellow") SettingsFrame.pack(fill = tk.BOTH, side = tk.TOP, expand = True) self.SettingsTab = ttk.Notebook(SettingsFrame) PreferencesTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(PreferencesTab, text = 'Preferences') AppearanceTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(AppearanceTab, text = 'Appearance') InfoTab = ttk.Frame(self.SettingsTab) self.SettingsTab.add(InfoTab, text = 'Info') self.SettingsTab.pack(fill = tk.BOTH, side = tk.TOP, expand = True) self.SettingsTab.select(default_tab) self.SettingsTab.focus_force() def main(): mainwindow = tk.Tk() app = AssistantGUI(mainwindow) mainwindow.mainloop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Bunz
相关产品推荐
相关产品推荐

