【问题标题】:Tkinter: how to pass variable from one class (window) to another class (window) - (not toplevel frame)?Tkinter:如何将变量从一个类(窗口)传递到另一个类(窗口) - (不是顶层框架)?
【发布时间】:2022-01-12 02:14:07
【问题描述】:

在带有 python 的 tkinter 中,当一个类(窗口)重用同一个框架(它不是顶层窗口)时,我如何将变量的值从一个类(窗口)传递到另一个类(窗口)。

例如,我有一个登录窗口,我想将用户名和帐户权限类型(管理员、操作员...)传递给主窗口。 如何做到这一点?

查看示例文件:

main.py

#!/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()

    def change(self, frame):
        self.frame.pack_forget() # delete currrent frame
        self.frame = frame(self)
        self.frame.pack() # make new frame


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

frm_login.py

from tkinter import *
from frm_default import Wmain

class Func(Frame):
    def go_to_main(self, event=None):
        self.myvar = self.entry_var.get() #pass the value of this variable to the class: Wmain
        self.master.change(Wmain)


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

from tkinter import *

class Wmain(Frame):
    def __init__(self, master=None, **kwargs):
        Frame.__init__(self, master, **kwargs)
        master.title('Second Window')
        master.geometry('600x400')

        self.label_var = Label(self, bg='red', fg='#ff0', text='How to show var of first window here?')
        self.label_var.pack()

【问题讨论】:

    标签: python class variables tkinter window


    【解决方案1】:

    其中一种方法是通过kwargs 传递所需的值:

    main.py
    class Mainframe(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.frame = Wlogin(self)
            self.frame.pack()
    
        # added **kwargs
        def change(self, frame, **kwargs):
            self.frame.pack_forget() # delete currrent frame
            self.frame = frame(self, **kwargs) ### pass **kwargs
            self.frame.pack() # make new frame
    
    frm_login.py
    class Func(Frame):
        def go_to_main(self, event=None):
            self.myvar = self.entry_var.get() #pass the value of this variable to the class: Wmain
            self.master.change(Wmain, data=self.myvar) # pass value via keyword 'data'
    
    ...
    
    frm_default.py
    class Wmain(Frame):
        def __init__(self, master=None, **kwargs):
            # get the value of keyword argument 'data'
            data = kwargs.pop('data', None)
            Frame.__init__(self, master, **kwargs)
            master.title('Second Window')
            master.geometry('600x400')
    
            self.label_var = Label(self, bg='red', fg='#ff0', text=data) # use 'data'
            self.label_var.pack()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多