Tkinter事件处理程序参考丢失在小部件上

2024-10-03 15:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我将一个事件处理程序放在一个类Verification中的一个单独的文件verification.py(试图使代码模块化)。主要GUI代码如下:

from tkinter import *
from make_widget import *
from verification import *

class LoginFrame(Frame):
    def __init__(self, parent):
    super(LoginFrame, self).__init__()

    self.parent = parent        
    self.initUI()

    # initialize the login screen UI  
    def initUI(self): 
        # Set up login frame properties 
        self.parent.title("Login Screen")

        # creating instruction label
        self.inst_lbl = MakeWidget.make_label(self.parent, "Please login to continue")

        # creating labels and entries for user name and password
        self.user_name = MakeWidget.make_entry(self.parent, caption="User Name:")
        self.pwd = MakeWidget.make_entry(self.parent, caption="User Password:", show="*")

        # create a login button
        login_btn = MakeWidget.make_button(self.parent, Verification.verify_user(self.user_name, self.pwd, self.inst_lbl), "Login")        


def main():
    top = Tk()    
    app = LoginFrame(top)
    top.mainloop()


if __name__ == '__main__':
    main()

# verification.py
from tkinter import * 

class Verification:
# verify user name and password
#----------------------------------------------------------------------
@staticmethod
def verify_user(user_name, pwd, inst_lbl):
    """verify users"""
    if user_name.get() == "admin" and pwd.get() == "123":
        inst_lbl.configure(text="User verified")
    else:
        inst_lbl.configure(text="Access denied. Invalid username or password")


# make_widget.py
from tkinter import * 

class MakeWidget(Frame):
def __init__(self, parent):
    super(MakeWidget, self).__init__()

    self.parent = parent        


# create a button widget 
#----------------------------------------------------------------------
@staticmethod
def make_button(parent, command, caption=NONE, side=TOP, width=0, **options):
    """make a button"""
    btn = Button(parent, text=caption, command=command)

    if side is not TOP:
        btn.pack(side=side)
    else:
        btn.pack()    

    return btn


# create a label widget
@staticmethod
def make_label(parent, caption=NONE, side=TOP, **options):
    label = Label(parent, text=caption, **options)

    if side is not TOP:
        label.pack(side=side)
    else:
        label.pack()

    return label


# create a entry widget
@staticmethod
def make_entry(parent, caption=NONE, side=TOP, width=0, **options):
    MakeWidget.make_label(parent, caption, side)
    entry = Entry(parent, **options)
    if width:
        entry.config(width=width)
    if side is not TOP:
        entry.pack(side=side)
    else:
        entry.pack()

    return entry        

现在,我希望LoginFrame中的inst_lbl能够configure并显示基于user_namepwd的新文本,但是inst_lbl没有更改文本(没有生成错误)。那么如何解决这个问题呢


Tags: nameselfmakeiftopdefsidelabel
1条回答
网友
1楼 · 发布于 2024-10-03 15:34:27

问题是这条线:

login_btn = MakeWidget.make_button(self.parent, Verification.verify_user(self.user_name, self.pwd, self.inst_lbl), "Login") 

您正在立即调用Verification.verify_user并将结果分配给button命令。必须传入对函数的引用,而不是函数的结果

类似问题的答案如下:https://stackoverflow.com/a/5771787/7432

相关问题 更多 >