我有以下代码:
from tkinter import *
from customer import Customer
from admin import Admin
from account import Account
from tkinter import ttk
root = Tk()
global username
global password
def login(self, username, password):
name = username.get()
passphrase = password.get()
msg = self.customer_login(name, passphrase)
root.config(height=500, width=500)
frame = Frame(root)
Label(root, text="Login").grid(row=0, columnspan=4)
Label(root, text="Username").grid(row=3, sticky=W, padx=4)
username = Entry(root).grid(row=3, column=2, sticky=W, pady=4)
Label(root, text="Password").grid(row=4, sticky=W, padx=4,)
password = Entry(root, show="*").grid(row=4, column=2, sticky=W, pady=4)
loginButton = Button(root, text="Login", width=40)
loginButton.grid(row=5, columnspan=4, pady=4, padx=4)
loginButton.bind("<Button-1>", login)
root.mainloop()
我不断得到的错误是:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
TypeError: login() missing 2 required positional arguments: 'username' and 'password'
为什么我会收到此错误?
答案 0 :(得分:2)
你试图只将一个参数传递给一个实际上不需要参数但 需要3个参数的方法。
当回调login
附加到bind
方法时,会向其发送一个位置参数,该参数表示有关该事件的信息,通常名为event
,即使未明确传递像你一样。在这种情况下,假设self
表示事件位置参数。虽然现在login
缺少两个位置参数,username
和password
。现在,如果你真的需要这些变量,我已经提供了不同的答案,但是因为你不是这个,我能想到的最简单。
替换:
def login(self, username, password):
使用:
def login(event):
此外,请参阅How to pass arguments to a Button command in Tkinter?,因为您可能希望使用按钮的command
选项,而不是赢得调用方法的点击事件使用键盘按下按钮,同样bind
和command
的行为也同样需要回调功能。唯一的区别是bind
隐式传递第一个位置参数。