我最近开始学习Tkinter。我创建了两个名为 "姓名 "和 "密码 "的输入部件。当用户输入姓名和密码后,如果用户点击 "提交",程序应该会随后列出它。不幸的是,这并不奏效。我试图把它写在一个类中,并把它作为一个参数传递给我的提交函数。
我收到了这个错误。
文件 "usrlibpython3.7tkinter"。启动.py",第1705行,在 召唤 return self.func(*args)TypeError: submit()缺少2个必需的位置性参数。'var_name'和'var_passwd'。
#/usr/bin/python3.7
from tkinter import *
class Window (Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
def init_window(self):
self.master.title("GUI")
self.pack(fill=BOTH, expand=1)
var_name = StringVar()
var_passwd = StringVar()
name = Label(self, text="Name: ")
name.place(x = 0, y = 0)
name_entry = Entry(root, textvariable = var_name)
name_entry.place(x = 90, y =0)
passwd = Label(self, text="Password: ")
passwd.place(x = 0, y = 90)
passwd_entry = Entry(root, textvariable = var_passwd)
passwd_entry.place(x = 90, y = 90)
Knop1 = Button(self, text="Submit", command=self.submit)
Knop1.place(x = 180, y=180)
def submit (self, var_name, var_passwd):
naam = var_name.get()
var_passwd = var_passwd.get()
print("The name is: ", naam)
print("The password is: ", var_passwd)
root = Tk()
root.geometry("500x300")
app = Window(root)
app.mainloop()
谁能帮帮我?我也在找一个好的Tkinter教程,其中用到了OOP。
你没有把变量传递给提交函数按钮。对于这种简单的情况,你可以使用一个lambda表达式作为Tkinter和回调函数之间的链接,否则Python会在创建widget之前调用回调函数。https:/effbot.orgzonetkinter-callbacks.htm
from tkinter import *
class Window (Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
def init_window(self):
self.master.title("GUI")
self.pack(fill=BOTH, expand=1)
var_name = StringVar()
var_passwd = StringVar()
name = Label(self, text="Name: ")
name.place(x = 0, y = 0)
name_entry = Entry(root, textvariable = var_name)
name_entry.place(x = 90, y =0)
passwd = Label(self, text="Password: ")
passwd.place(x = 0, y = 90)
passwd_entry = Entry(root, textvariable =var_passwd)
passwd_entry.place(x = 90, y = 90)
# Changed this line
Knop1 = Button(self, text="Submit", command=lambda: self.submit(var_name, var_passwd))
Knop1.place(x = 180, y=180)
def submit (self, var_name, var_passwd):
naam = var_name.get()
var_passwd = var_passwd.get()
print("The name is: ", naam)
print("The password is: ", var_passwd)
root = Tk()
root.geometry("500x300")
app = Window(root)
app.mainloop()
针对你提出的关于用tkinter进行OOP的问题,这个问题有一些好的建议。结构一个tkinter应用程序的最佳方式?
一般来说,最好的方式是在 command
的按钮调用一个不接受参数的函数。由于你已经做了一个特殊用途的函数,总是在相同的变量上操作,你可以让它直接访问变量。
首先,让变量成为类的一个属性,然后,定义你的函数来访问这些变量。
def init_window(self):
...
self.var_name = StringVar()
self.var_passwd = StringVar()
..
然后,定义你的函数来访问这些变量。
def submit (self):
naam = self.var_name.get()
var_passwd = self.var_passwd.get()
...
最后,修改你的按钮如何调用这个函数。
Knop1 = Button(self, text="Submit", command=self.submit)
注意: 如果你没有使用 tkinter 变量的特殊属性 (比如跟踪机制), 你就不需要使用... StringVar
根本没有。
例如:
def init_window(self):
...
self.name_entry = Entry(root, textvariable = var_name)
self.passwd_entry = Entry(root, textvariable =var_passwd)
...
def submit (self):
naam = self.name_entry.get()
var_passwd = self.passwd_entry.get()
...