GUI Python登录错误:缺少参数

2024-10-04 09:21:51 发布

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

我有一个问题,这个图形用户界面登录我试图使。代码如下:

from tkinter import *

class OneBiggerWindow():
    def __init__(self, master):

        self.master = master

        master.label_usr = Label(text = 'Enter Username')
        master.label_usr.pack()

        master.entry_usr = Entry(master)
        master.entry_usr.pack()

        master.label_pswrd = Label(text = 'Enter Password')
        master.label_pswrd.pack()

        master.entry_pswrd = Entry(master)
        master.entry_pswrd.pack(padx = 15)

        master.submit = Button(text = 'Submit', command = self.Pswrd_Chkr)
        master.submit.pack(pady = 10)

    def Pswrd_Chkr(self, master):
        username = master.entry_pswrd.get()
        password = master.entry_usr.get()
        if username == 'BigBoy' and password == 55595:
            print('You got it')
        else:
            print('Boohoo, you are incorrect')

root = Tk()
GuiBoi = OneBiggerWindow(root)
root.mainloop()

因此,小窗口打开,我输入用户名和密码,我得到这个错误:

File "C:\Users\MyName\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
TypeError: Pswrd_Chkr() missing 1 required positional argument: 'master'

我不知道怎么解决这个问题。任何帮助都将不胜感激!非常感谢,节日快乐!你知道吗


Tags: textselfmasterinittkinterusrdefroot
1条回答
网友
1楼 · 发布于 2024-10-04 09:21:51

既然您使用OOP作为开发用户界面的范例,那么您应该充分利用它提供的所有好处。然而,有些东西告诉我你不太熟悉类、对象、实例变量和其他面向对象的概念。你知道吗

  1. 我建议您将类设计为实际继承自tkinter.Tk,因为用户界面部分(widgets)的状态和行为被分组到单独的对象中是有意义的,这些对象依次位于单独的名称空间中。

  2. 除此之外,我还建议您去掉from tkinter import *,因为您不知道导入什么名称。它可以替换先前导入的名称,并且很难看到程序中的名称应该来自何处。改用import tkinter as tk,这是Python中的一种习惯用法。

  3. 您可能想阅读PEP8在谈到naming conventionsspaces around keyword arguments时所说的话,其余的都是关于Python编码风格指南的内容:

  4. 代码中还有其他小问题—例如,在两种不同的数据类型之间执行对象相等性检查、小的拼写错误等。

在任何情况下,以下是我的观点,你可以稍微重写上面的代码:

import tkinter as tk

class Application(tk.Tk):

    def __init__(self):
        super().__init__()
        self._create_widgets()

    def _create_widgets(self):
        """
        Creating all root window widgets and configuring them properly
        """
        label_usr = tk.Label(text='Enter Username')
        label_usr.pack()
        self.entry_usr = tk.Entry(self)
        self.entry_usr.pack()
        label_pswrd = tk.Label(self, text='Enter Password')
        label_pswrd.pack()
        self.entry_pswrd = tk.Entry(self)
        self.entry_pswrd.pack(padx=15)
        submit = tk.Button(text='Submit', command=self.pswrd_chkr)
        submit.pack(pady=10)

    def pswrd_chkr(self):
        username = self.entry_usr.get()
        password = self.entry_pswrd.get()

        print(
            'You got it!'
            if username == 'BigBoy' and int(password) == 55595
            else 'Boohoo, you are incorrect'
        )

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

当您克服上述问题时,有几个快速的建议:您可以通过提供一个按钮来稍微改善用户体验,以便在输入用户的凭据后清除输入框,或者更好的是,使其自动清除这两个字段。此外,密码字段可以隐藏您实际键入的字符。你知道吗

一个长期明智的建议:你需要跟上你的OOP!:)

相关问题 更多 >