Как заставить функцию возвращать значение при каждом нажатии кнопки tkinter? - PullRequest
0 голосов
/ 10 марта 2020

Я новичок в Tkinter и Python. Я работаю с некоторыми флажками и функциями кнопок. Я хочу, чтобы вывод был output: 0, output: 1,... (0 - когда флажок не отмечен, и 1 - когда флажок отмечен). Вывод распечатывается при каждом нажатии кнопки «Отправить». Поскольку в данный момент он печатается только один раз в начале

Мне просто интересно, есть ли способ сделать это

Спасибо и хорошего дня :)

import tkinter as tk
from tkinter import *

root = tk.Tk()

class Blah:
    def __init__(self):
       self.varAll = IntVar()

    def Check(self):   
        but1 = Checkbutton(root, text='Selected', variable = self.varAll)
        but1.pack(side=LEFT, pady=4)

        b2 = tk.Button(root, text='Submit', command= self.State)
        b2.pack(side=tk.LEFT, padx=5, pady=15)
        b2.wait_variable(self.varAll)

    def State(self):
        print('State: ', self.varAll.get())
        self.state = self.varAll.get()
        return self.state

def Main():
    listt = Blah()
    listt.Check()
    #root.wait_variable(listt.varAll)
    print("output ", listt.varAll.get())

if __name__ == '__main__':
    Main()

Ответы [ 2 ]

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

Вы можете получить этот вывод, добавив обратный вызов «наблюдатель» к вашему IntVar, который будет автоматически вызываться при каждом изменении его значения - см. Статью Классы переменных (BooleanVar, DoubleVar, IntVar, StringVar) .

Вот как я бы изменил ваш код для его использования. Обратите внимание на добавленный метод Notify(). Я также прокомментировал ряд вещей, которые мне не нужны. Нет никаких оснований для State() возвращать что-либо, поскольку оно будет вызываться только tkinter, и эти wait_variable() вызовы также не нужны (если вы сами явно вызываете mainloop()).

import tkinter as tk
from tkinter import *

class Blah:
    def __init__(self):
       self.varAll = IntVar()
       self.varAll.trace('w', self.Notify)

    def Check(self):
        but1 = Checkbutton(root, text='Selected', variable=self.varAll)
        but1.pack(side=LEFT, pady=4)

        b2 = tk.Button(root, text='Submit', command=self.State)
        b2.pack(side=tk.LEFT, padx=5, pady=15)
#        b2.wait_variable(self.varAll)

    def State(self):
        print('State: ', self.varAll.get())
        self.state = self.varAll.get()
#        return self.state

    def Notify(self, *args):
        print("output ", self.varAll.get())


def Main():
    listt = Blah()
    listt.Check()
#    root.wait_variable(listt.varAll)
#    print("output ", listt.varAll.get())
    root.mainloop()

if __name__ == '__main__':
    root = tk.Tk()
    Main()
0 голосов
/ 10 марта 2020

Вам не хватает .mainloop. Добавьте его в функцию Main после оператора print как:

def Main():
    listt = Blah()
    listt.Check()
    #root.wait_variable(listt.varAll)
    print("output ", listt.varAll.get())
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...