Команды кнопки Tkinter, пока кнопка находится внутри класса - PullRequest
1 голос
/ 10 марта 2019

Я создаю приложение с графическим интерфейсом в Tkinter и структурировал свою программу, используя подход ООП. Я создал экземпляр tk.Tk () и класс, который наследуется от tk.Frame, принимает экземпляр Tk () в качестве параметра, и я делаю создание графического интерфейса пользователя и его логику внутри класса.

Внутри класса я создал холст, на котором разместил несколько виджетов. Один из моих виджетов - это запись, а другой - кнопка. Команда кнопки должна быть функцией, которая принимает в качестве входного параметра значение current для элемента entry (используя Entry.get ()) и что-то делает с ним, например, печатает его на экране.

Это код, в котором я воссоздал проблему:

import tkinter as tk

class myClass(tk.Frame):
    def __init__(self, master):
        super(myClass, self).__init__(master)
        self.pack()
        self.Widgets()

    def getVal(self, val):
        print("The value is: ", val)

    def Widgets(self):
        canvas = tk.Canvas(self, width=500, height=500, bg='green')
        canvas.grid(row=0, column=0)
        entry = tk.Entry()
        button = tk.Button(text='pressme')
        button['command'] = lambda arg = entry.get() : self.getVal(arg)

        window = canvas.create_window(100, 100, window=entry)
        window2 = canvas.create_window(100, 200, window=button)

root = tk.Tk()
root.title("MyGUI")
classinstance = myClass(root)
root.mainloop()

Функция 'getVal' из класса должна печатать независимо от значения аргумента, где должно быть значение current из записи GUI. Проблема заключается в том, что моя программа видит только начальное значение из этой записи (которая в данном случае является пустой строкой) и не изменяет ее впоследствии, когда я обновляю графический интерфейс во время выполнения.

Теперь я предполагаю, что это потому, что в программе main .py classinstance создается с некоторыми значениями по умолчанию до того, как приложение входит в функцию mainloop () tkinter, и однажды в этой функции зацикливания я не могу вернуться внутрь Класс и изменить значения. Пожалуйста, помогите мне исправить эту проблему и объясните мне, как я мог сделать свое заявление, чтобы команда кнопки получила обновленную версию значения записи, а не исходную. Спасибо за чтение моего поста!

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Ошибка была обнаружена в функции кнопки, поскольку lambda arg = entry.get() импортирует arg только при создании кнопки.Затем, когда кнопка нажата, лямбда-функция передает значение arg, полученное в начале, в функцию, без повторного импорта.

import tkinter as tk

class myClass(tk.Frame):
    def __init__(self, master):
        super(myClass, self).__init__(master)
        self.pack()
        self.Widgets()

    def getVal(self, val):
        print("The value is: ", val)

    def Widgets(self):
        canvas = tk.Canvas(self, width=500, height=500, bg='green')
        canvas.grid(row=0, column=0)
        var = tk.StringVar()
        entry = tk.Entry(textvariable = var)
        button = tk.Button(text='pressme')
        button['command'] = lambda: self.getVal(var.get())

        window = canvas.create_window(100, 100, window=entry)
        window2 = canvas.create_window(100, 200, window=button)

root = tk.Tk()
root.title("MyGUI")
classinstance = myClass(root)
root.mainloop()
0 голосов
/ 10 марта 2019

Как заметил @ Aran-Fey, лямбда-функция всегда использовала исходное значение arg и не меняла его. Чтобы это работало, нужно использовать метод entry.get (), а не аргумент по умолчанию:

lambda: self.getVal(entry.get())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...