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")
...