每当按下tkinter按钮时,如何使函数返回值?

时间:2020-03-10 13:21:56

标签: python button tkinter

我是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 :(得分:0)

您缺少.mainloop。在Main语句后的print函数中将其添加为:

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

答案 1 :(得分:0)

您可以通过在IntVar上添加“观察者”回调来获得该输出,只要其值发生更改,该回调就会被自动调用-请参阅文章The Variable Classes (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()