如何在ttk.Checkbox()值更改(python)时运行代码?

时间:2015-01-18 14:57:55

标签: python-3.x checkbox tkinter

我正在学习使用tkinter / ttk(当涉及GUI编程时,我仍然是一个菜鸟),我遇到了一个问题,我无法完全理解。

我要做的是创建一个程序,它为用户提供多个复选框,并根据用户检查的内容,从互联网上获取并获取一些数据。我做了几个用于测试的复选框,并将它们全部绑定到同一个函数中。

我遇到的问题是虽然this source声称在ttk.Checkbox中使用命令选项时,该函数每次都会被称为 复选框的状态发生了变化(我假设更改=勾选/取消),我只是看不到它的发生(可能只是我没有正确理解它)。我将复制粘贴我正在尝试运行的代码(我删除了格式化,图像等以使其更小更简单):我正在使用Python v3.4.2和Tcl / Tk v8.6)

from tkinter import *
from tkinter import ttk

nimekiri = []

def specChoice(x):
    choice = wtf[x].get()
    print("step 1") #temp check 1 (to see from console if and when the program reaches this point)
    if len(choice) != 0:
        print("step 2") #temp check 2
        spec = choice.split(" ")[0]
        tic = choice.split(" ")[1]
        if tic == "yes":
            print("step 3") #temp check 3
            nimekiri.append(spec)
        elif tic == "no":
            if spec == nimekiri[x].get():
                nimekiri.remove(spec)


root = Tk()
# Frames
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

spec_frame = ttk.Labelframe(root, text="Placeholder for txt: ", padding="9 9 12 12")
spec_frame.grid(column=0, row=0, sticky=(N, W, E, S))

results_frame = ttk.Labelframe(root, text="Results: ", padding="3 3 12 12")
results_frame.grid(column=10, row = 0, sticky=(N, W, E, S))

# Text Labels
ttk.Label(spec_frame, text="Question:").grid(column=1, row=1, sticky=(N,S,W))
ttk.Label(spec_frame, text="Choice 1").grid(column=1, row=2, sticky=(N,S,W))
ttk.Label(spec_frame, text="Choice 2").grid(column=1, row=3, sticky=(N,S,W))

# Checkboxes etc
results_window = Text(results_frame, state="disabled", width=44, height = 48, wrap="none")
results_window.grid(column=10, row=1, sticky=W)

wtf = []
wtf.append(StringVar())
wtf.append(StringVar())
wtf[0].set("choice1 no")
wtf[0].set("choice2 no")
ttk.Checkbutton(spec_frame, command=specChoice(0), variable=wtf[0],
                onvalue="choice1 yes", offvalue="choice1 no").grid(column=0, row=2, sticky=E)
ttk.Checkbutton(spec_frame, command=specChoice(1), variable=wtf[1],
                onvalue="choice2 yes", offvalue="choice2 no").grid(column=0, row=3, sticky=E)


#wtf[0].trace("w", specChoice2(0))

root.mainloop()

在上面的代码中,我期待发生的是当用户抽搐选择1框时,wtf [0]的值将被更改并且specChoice(0)函数将被运行,但是使用print()函数我添加似乎specChoice仅在我启动程序时运行,因此程序永远不会到达#temp check 3.(在我将默认值添加到复选框变量之前,它甚至没有达到#temp check 2)

1 个答案:

答案 0 :(得分:0)

使用command=specChoice(0)时,将specChoice(0)的调用返回值分配给命令None。您需要将函数传递给命令,而不是函数调用,如command=specChoice 但是,这种方式无法传递函数参数。要解决此问题,您可以创建一个名为specChoice(0)的匿名函数,如:

ttk.Checkbutton(spec_frame, command = lambda: specChoice(0), ...).grid(...)

这基本上是这样做的:

def anonymous_function_0():
    specChoice(0)

ttk.Checkbutton(spec_frame, command=anonymous_function_0, ...).grid(...)

但它在一条线上完成。