Tkinter Python:如何用入口函数传递参数?

问题描述 投票:0回答:1

我最近开始学习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。

python tkinter tkinter-entry
1个回答
0
投票

你没有把变量传递给提交函数按钮。对于这种简单的情况,你可以使用一个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应用程序的最佳方式?


0
投票

一般来说,最好的方式是在 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()
    ...
© www.soinside.com 2019 - 2024. All rights reserved.