【问题标题】:Tkinter: How to pass arguments from Entry widgets to function?Tkinter:如何将参数从 Entry 小部件传递给函数?
【发布时间】:2020-08-16 00:58:16
【问题描述】:

我创建了两个名为name_entrypasswd_entryEntry 小部件。用户输入他的姓名和密码后,如果用户单击提交按钮,程序随后应将其列出。

不幸的是,这不起作用。我正在尝试在一个类中编写它并将其作为参数传递给我的提交函数。

我收到此错误:

File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: submit() missing 2 required positional arguments: 'var_name' and '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()

谁能帮助我?我也在寻找一个使用 OOP 的优秀 Tkinter 教程。

【问题讨论】:

标签: python tkinter tkinter-entry


【解决方案1】:

一般来说,按钮的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()
    ...

【讨论】:

    【解决方案2】:

    您尚未将变量传递给提交功能按钮。对于这样的简单情况,可以使用 lambda 表达式作为 Tkinter 和回调函数之间的链接,否则 Python 会在创建小部件之前调用回调函数: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()
    

    要解决您关于 tkinter 的 OOP 的问题,这个问题有一些很好的建议:Best way to structure a tkinter application?

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 2016-02-01
      • 2016-12-17
      相关资源
      最近更新 更多