GUI Python登录错误:缺少参数

问题描述 投票:-1回答:1

我正在尝试使用此GUI登录的问题。这是代码:

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'

我不知道如何解决这个问题。任何帮助将非常感激!非常感谢,节日快乐!

python python-3.x tkinter
1个回答
1
投票

由于您使用OOP作为开发用户界面的范例,因此您应该充分利用它提供的所有好处。但是,有些东西告诉我你不熟悉类,对象,实例变量和其他OOP概念。

  1. 我建议你设计你的类实际上从tkinter.Tk继承,因为用户界面部分(小部件)的状态和行为被分组成单独的对象是有意义的,这些对象都是在一个单独的命名空间中。
  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! :)

© www.soinside.com 2019 - 2024. All rights reserved.