Python Tkinter Checkbutton问题

use*_*024 1 python checkbox tkinter button

我有两个非常简单的检查按钮,其变量我保存在列表(varss)和一个按钮.但是我不明白为什么当我调用var_states(通过按下按钮)时,我无法获得off/on值.任何帮助表示赞赏.谢谢!

from Tkinter import *

def run():
    # create the root and the canvas
    root = Tk()
    canvas = Canvas(root, width=300, height=200)
    canvas.pack()
    class Struct: pass
    canvas.data = Struct()
    # canvas.data.givenIngredients = set()

    prefInput(canvas)
    # and launch the app
    root.mainloop()

def var_states(varss):
    for var in varss:
        var.get()

def prefInput(canvas):
    master = Tk()
    var1, var2 = IntVar(), IntVar()
    Checkbutton(master, text="male", variable=var1).grid(row=1, sticky=W)
    varss = [var1, var2]
    Checkbutton(master, text="female", variable=var2).grid(row=2, sticky=W)
    Button(master, text='Show', command=lambda:var_states(varss)).grid(row=4, sticky=W, pady=4)

run()
Run Code Online (Sandbox Code Playgroud)

小智 5

您已经创建了两个Tcl解释器,每个解释器都有一个Tk().每个Tcl解释器都有与每个其他Tcl解释器不同的变量.

创建的第一个解释器成为Tkinter对象的默认解释器,该对象没有明确地将自身与现有解释器相关联(例如,通过将该解释器中的窗口小部件传递给其构造函数中的"master")

您可能不打算创建两个解释器,因此对于初学者不执行

master = Tk()
Run Code Online (Sandbox Code Playgroud)

在prefInput中.相反,使用canvas参数作为第一个参数的Checkbutton调用(替代master),以及在呼叫使用它IntVar:var1, var2 = IntVar(canvas), IntVar(canvas).(如果您确实需要在应用程序中使用其他窗口,请在第二个窗口中使用Tkinter.Toplevel而不是Tkinter.Tk)

最后,为了进行测试,我更改了您的Var_states功能,以便打印更多信息:

def var_states(varss):
    print "var_states", varss
    for var in varss:
        print var, var.get()
Run Code Online (Sandbox Code Playgroud)

最终的节目如下:

from Tkinter import *

def run():
    # create the root and the canvas
    root = Tk()
    canvas = Canvas(root, width=300, height=200)
    canvas.pack()
    class Struct: pass
    canvas.data = Struct()
    # canvas.data.givenIngredients = set()

    prefInput(canvas)
    # and launch the app
    root.mainloop()

def var_states(varss):
    print "var_states", varss
    for var in varss:
        print var, var.get()

def prefInput(canvas):
    var1, var2 = IntVar(canvas), IntVar(canvas)
    Checkbutton(canvas, text="male", variable=var1).grid(row=1, sticky=W)
    varss = [var1, var2]
    Checkbutton(canvas, text="female", variable=var2).grid(row=2, sticky=W)
    Button(canvas, text='Show', command=lambda:var_states(varss)).grid(row=4, sticky=W, pady=4)

run()
Run Code Online (Sandbox Code Playgroud)