[英]Tkinter Python: how to pass argument with entry function
我最近开始学习 Tkinter。 我创建了两个名为“名称”和“密码”的条目小部件。 用户输入他的姓名和密码后,如果用户单击“提交”,程序随后应将其列出。 不幸的是,这不起作用。 我正在尝试将其写入 class 并将其作为参数传递给我的提交 function。
我收到此错误:
文件“/usr/lib/python3.7/tkinter/init .py”,第 1705 行,在调用中返回self.func (*args) TypeError: submit() missing 2 required positional arguments: '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。
您尚未将变量传递给提交 function 按钮。 For simple cases like this, you can use a lambda expression as a link between Tkinter and the callback function, otherwise Python will call the callback function before creating the widget: https://effbot.org/zone/tkinter-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()
为了解决您关于 OOP 和 tkinter 的问题,这个问题有一些很好的建议: 构建 tkinter 应用程序的最佳方法?
作为一般规则,最好使用按钮command
调用不接受 arguments 的 function。 由于您制作了始终对相同变量进行操作的专用 function,因此您可以直接访问变量。
首先,使变量成为 class 的属性:
def init_window(self):
...
self.var_name = StringVar()
self.var_passwd = StringVar()
..
然后,定义您的 function 以访问这些变量:
def submit (self):
naam = self.var_name.get()
var_passwd = self.var_passwd.get()
...
最后,修改按钮调用此 function 的方式:
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()
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.