Tkinter Python: как передать аргумент с помощью функции входа - PullRequest
0 голосов
/ 01 мая 2020

Я недавно начал изучать Tkinter. Я создал два виджета для входа под названием «Имя» и «Пароль». После того, как пользователь вводит свое имя и пароль, программа должна затем перечислить его, если пользователь нажимает «Отправить». К сожалению, это не работает. Я пытаюсь написать это в классе и передать его в качестве аргумента моей функции отправки.

Я получаю эту ошибку:

Файл "/usr/lib/python3.7/tkinter/init.py", строка 1705, в call return self.fun c (* 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.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Как правило, лучше всего 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()
    ...
0 голосов
/ 01 мая 2020

Вы не передали переменные кнопке функции отправки. Для таких простых случаев, как этот, вы можете использовать лямбда-выражение в качестве ссылки между 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()

Чтобы ответить на ваш вопрос о OOP с помощью tkinter, у этого вопроса есть несколько полезных советов: Лучший способ структурировать приложение tkinter?

...