簡體   English   中英

Tkinter Python:如何通過條目 function 傳遞參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM