Python Tkinter按钮回调缺少包含的参数

Python Tkinter按钮回调缺少包含的参数,python,tkinter,loading,typeerror,Python,Tkinter,Loading,Typeerror,在尝试创建一个程序,该程序接受用户给定的用户名和密码,然后加载该文档时,我遇到了一个奇怪的错误 load\u user()缺少1个必需的位置参数:“username”,但该参数已由用户传递。我将在下面包含完整的代码,但问题可能在于未完成的加载函数,我认为: def load_user(self,username): print("...") jj = open("data_"+str(username)+".txt","r") lines = jj.readlines()

在尝试创建一个程序,该程序接受用户给定的用户名和密码,然后加载该文档时,我遇到了一个奇怪的错误
load\u user()缺少1个必需的位置参数:“username”
,但该参数已由用户传递。我将在下面包含完整的代码,但问题可能在于未完成的加载函数,我认为:

def load_user(self,username):
    print("...")
    jj = open("data_"+str(username)+".txt","r")
    lines = jj.readlines()
    user = str(lines[2])
    passw = str(lines[4])
    print("...")
    if password == passw:
        print("Loaded save of "+user)
就像我说的,整个课程都包含在下面,以防它是另一个领域的问题

感谢您的帮助,谢谢

编辑:为了澄清,我需要在按下按钮时执行命令,因此传递self.load\u user(…)不起作用,因为它在Tkinter打开时执行

from tkinter import *
get = 0

class Menu_F:
    def __init__(self,master):

        frame = Frame(master)
        frame.grid()

        title_username = Label(master, text="User Name")
        title_username.grid(row=0, column=0)

        title_password = Label(master, text="Password")
        title_password.grid(row=1, column=0)

        global username
        username = Entry(master, bd=5)
        username.grid(row=0, column=1)

        global password
        password = Entry(master, bd=5, show="*")
        password.grid(row=1, column=1)

        load_game = Button(master, text="Load Game",
                           fg="black",command=self.load_user)
        load_game.grid(row=3, column=1)

        new_game = Button(master, text="New Game",
                          fg="black",command=self.new_user)
        new_game.grid(row=3, column=0)

        confirm_username = Button(master, text="Done",
                                  fg="black",command=self.get_username)
        confirm_username.grid(row=0, column=2)

        confirm_password = Button(master, text="Done",
                                  fg="black",command=self.get_password)
        confirm_password.grid(row=1, column=2)

    def get_username(self):
        get = 1
        global username
        username = username.get()
        print("Username is: "+username)

    def get_password(self):
        global password
        password = password.get()
        print("Password is: "+password)

    def load_user(self,username):
        print("...")
        jj = open("data_"+str(username)+".txt","r")
        lines = jj.readlines()
        user = str(lines[2])
        passw = str(lines[4])
        print("...")
        if password == passw:
            print("Loaded save of "+user)

    def save_user(self,username,password,progress):
        ss = open("data_"+str(username)+".txt","w")
        ss.write("""_-_-_
-_-_-
"""+str(username)+"""
_-_-_
"""+str(password)+"""
-_-_-
"""+int(progress))

    def new_user(self,username,password):
        nn = open("data_"+str(username)+".txt","w")
        nn.write("""_-_-_
-_-_-
"""+str(username)+"""
_-_-_
"""+str(password)+"""
-_-_-
0""")

root = Tk()
root.resizable(width=FALSE, height=FALSE)
app = Menu_F(root)
mainloop()

是您的回调,但您没有向函数传递任何参数,即使它需要一个参数。

用户实际上没有向函数传递用户名。请输入以下代码:

load_game = Button(master, text="Load Game",
                   fg="black",command=self.load_user)
当点击
load\u game
按钮时,基本上调用了
self.load\u user()
,没有参数。您可以通过两种方式解决此问题:

  • 命令
    转换为
    lambda
    功能:

  • 消除函数的
    username
    参数,只需让它访问全局变量:


  • 如果我给它传递一个参数,它会在启动时执行回调函数,而不是只在按下按钮时执行。调用时使用lambda表达式
    command=self.load\u user
    调用
    self.load\u user()。这需要一场辩论
    command=(lambda u=username:self.load\u user(u))
    第二种变体在我看来更可取。将信息传递给例程可以轻松访问的例程是毫无意义的。在load\u user中声明为全局时,“name'username'是参数且全局”错误,因此我可以使用lambda代替。谢谢您是否从函数定义中删除了
    username
    参数?啊,我明白了,我没有。现在效果很好,再次感谢。
    load_game = Button(master, text="Load Game",
                       fg="black",command=self.load_user)
    
    load_game = Button(master, text="Load Game",
                       fg="black",command=lambda: self.load_user(username.get()))
    
    def load_user(self):
            print("...")
            global username
            jj = open("data_"+str(username.get())+".txt","r")
            ...