GUI Python登录错误:缺少参数

时间:2017-12-27 01:57:22

标签: python python-3.x tkinter

我正在尝试使用此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'

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

1 个答案:

答案 0 :(得分:1)

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

  1. 我建议您将类设计为实际继承自tkinter.Tk,因为用户界面部分(小部件)的状态和行为被分组为单独的对象是有意义的,这些都是在一个单独的命名空间中。

  2. 除此之外,我还建议您摆脱from tkinter import *,因为您不知道导入的名称。它可以替换您之前导入的名称,这使得很难看到程序中的名称应该来自哪里。请改用import tkinter as tk,这在Python中是一种习惯用法。

  3. 您可能想要阅读PEP8在naming conventionsspaces around keyword arguments时所说的内容,其余内容通常是Python编码样式指南:

  4. 您在代码中遇到了其他小问题 - 例如,您正在两种不同的数据类型之间进行对象相等性检查,小错别字等。

  5. 无论如何,这是我的观点,你可以稍微重写上面的代码:

    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! :)