Tkinter 按钮回调缺少它包含的参数[重复]
Posted
技术标签:
【中文标题】Tkinter 按钮回调缺少它包含的参数[重复]【英文标题】:Tkinter button callback missing an argument that it contains [duplicate] 【发布时间】:2015-07-17 03:12:33 【问题描述】:在尝试制作一个接受用户提供的用户名和密码然后加载该文档的程序时,我遇到了一个奇怪的错误
load_user() missing 1 required positional argument: '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_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()
【问题讨论】:
command=self.load_user
在调用时调用self.load_user()
。它需要一个论据。 command=(lambda u=username: self.load_user(u))
【参考方案1】:
函数实际上并没有被用户传递用户名。您的以下代码:
load_game = Button(master, text="Load Game",
fg="black",command=self.load_user)
基本上调用self.load_user()
- 没有参数 - 当load_game
按钮被点击时。您可以通过两种方式解决此问题:
-
将
command
转换为lambda
函数:
load_game = Button(master, text="Load Game",
fg="black",command=lambda: self.load_user(username.get()))
-
消除函数的
username
参数并让它访问该全局变量:
def load_user(self):
print("...")
global username
jj = open("data_"+str(username.get())+".txt","r")
...
【讨论】:
第二种变体更适合 IMO。将信息传递给例程易于访问的例程是没有意义的。 "name 'username' is parameter and global" 在 load_user 中将其声明为全局时出错,因此我可以改用 lambda。谢谢! 您是否从函数定义中删除了username
参数?
啊,我明白了,我没有。现在完美运行,再次感谢。【参考方案2】:
command=self.load_user
是你的回调,但你没有向函数传递任何参数,即使它需要一个。
【讨论】:
如果我传递一个参数,它会在启动时执行回调函数,而不是仅在按下按钮时执行。 使用 lambda 表达式以上是关于Tkinter 按钮回调缺少它包含的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章