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
相关产品推荐
相关产品推荐

