You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter 如何跨类选中ttk.Notebook的指定标签页

实现方案

要实现跨类切换ttk.Notebook的选中标签,只需要两步核心调整:

  • 首先将SettingsGUI类中的Notebook组件设置为实例属性,让外部可以访问该组件
  • 之后在主界面的OpenInfo方法中调用Notebook的select方法选中Info标签即可

具体修改点

  1. 调整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()
  1. 修改主界面的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:36:08