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

Tkinter非顶层帧场景下如何在不同类(窗口)之间传递变量

Tkinter复用主窗口Frame时的跨类变量传递方案

针对你给出的登录页传用户名、权限到主页的场景,这里给两种可直接落地的实现方式:

方案1:修改页面切换方法支持参数传递(推荐单场景传参用)

核心逻辑:改造主窗口的change切换方法,支持传入额外参数并转发给目标Frame的初始化方法。

第一步:修改main.py的Mainframe类

#!/usr/bin/env python3

from tkinter import *
from frm_login import Wlogin

class Mainframe(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.frame = Wlogin(self)
        self.frame.pack()

    # 修改change方法,支持接收额外参数
    def change(self, frame, **kwargs):
        self.frame.pack_forget() 
        # 把参数传给新Frame的初始化方法
        self.frame = frame(self, **kwargs)
        self.frame.pack() 


if __name__== '__main__':
    app = Mainframe()
    app.mainloop()

第二步:修改frm_login.py的跳转逻辑

把要传递的变量作为参数传给change方法:

from tkinter import *
from frm_default import Wmain

class Func(Frame):
    def go_to_main(self, event=None):
        input_username = self.entry_var.get() 
        # 跳转时传入需要的参数,比如用户名、权限
        self.master.change(Wmain, username=input_username, user_role='Admin')


class Wlogin(Func):
    def __init__(self, master=None, **kwargs):
        Frame.__init__(self, master, **kwargs)

        master.title('First Window')
        master.geometry('300x200')

        self.myvar = StringVar()

        self.entry_var = Entry(self, textvariable=self.myvar)
        self.entry_var.pack()
        self.entry_var.focus()

        self.btn = Button(self, text='Go', command=self.go_to_main)
        self.btn.pack()

第三步:修改frm_default.py的Wmain类接收参数

从初始化参数里取出传递过来的变量使用即可:

from tkinter import *

class Wmain(Frame):
    def __init__(self, master=None, **kwargs):
        # 取出传递过来的参数,pop之后不影响Frame的原有初始化逻辑
        self.username = kwargs.pop('username', '游客')
        self.user_role = kwargs.pop('user_role', '普通用户')
        Frame.__init__(self, master, **kwargs)
        master.title('Second Window')
        master.geometry('600x400')

        # 直接使用拿到的变量渲染组件
        show_text = f'当前用户:{self.username},权限:{self.user_role}'
        self.label_var = Label(self, bg='red', fg='#ff0', text=show_text)
        self.label_var.pack()

方案2:主窗口挂载全局共享变量(适合多页面共享数据用)

如果需要传递的变量是全局通用的(比如用户信息、配置项),可以直接把变量挂载到主窗口实例上,所有子Frame都可以通过self.master直接读写:

  • 先在Mainframe的__init__里提前声明共享变量:self.user_info = {}
  • 登录页跳转前直接赋值:self.master.user_info['username'] = self.entry_var.get()
  • 主页面直接读取:show_text = f"当前用户:{self.master.user_info.get('username', '游客')}"

内容的提问来源于stack exchange,提问作者Mrkalvin Bs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:45:00