IntVar 不在函数 Tkinter 之间更新

IntVar not updating between function Tkinter

问题:IntVar 不更新

我正在尝试创建一个 window 显示 3 个帧,其中有 9 个复选按钮,每帧选择 1 个复选按钮来更改图像可视化的颜色图,这是我的大代码的一小部分打字。 这是我更改色带的代码:

class Inicio(tk.Tk):

    def __init__(self, *args, **kwargs):
    ...

#Cambiar_banda_de_colores

    def cambio_banda(self):

        cambio = tk.Tk()
        cambio.wm_title("Cambio de bandas del Landsat")
        top_frame = tk.Frame(cambio, bg='white', bd=2, relief=tk.SUNKEN)
        top_frame.pack(side=tk.TOP ,fill="both", expand=True)
        ttk.Label(top_frame, text="Escoja 3 bandas para visualizacion en orden (RGB) ").pack(side=tk.TOP )

     #Frame 1
        box1 = tk.LabelFrame(top_frame, text="Primera Banda ", bg='red', width=110, height= 250,  bd=3, relief=tk.RAISED)
        box1.pack(side=tk.LEFT,fill="both")

    #Frame 2
        box2 = tk.LabelFrame(top_frame, text="Segunda Banda ", bg='green', width=110, height= 250,  bd=3, relief=tk.RAISED)
        box2.pack(side=tk.LEFT,fill="both")

    #Frame 3
        box3 = tk.LabelFrame(top_frame, text="Tercera Banda ", bg='blue', width=110, height= 250,  bd=3, relief=tk.RAISED)
        box3.pack(side=tk.LEFT,fill="both")

    #my 3 IntVar
        ssbanda1 = tk.IntVar()
        ssbanda2 = tk.IntVar()
        ssbanda3 = tk.IntVar()

    #an inside funtion just to print
        def cambiar():

            print "Bandas seleccionadas"
            print "banda1: ", ssbanda1.get(), ", banda2: ", self.ssbanda2.get(), ", banda3: ", self.ssbanda3.get()


#To optimize code I am creating the checkbutton like this:
        lista = range(1, 10, 1)
        lista2 = ['Banda Costera', 'Banda Azul', 'Banda Verde', 'Banda Rojo', 'Banda NIR', 'Banda SWIR 1',
              'Banda SWIR 2', 'Banda Pancromatica', 'Banda Cirrus']

        for l1, l2 in zip(lista, lista2, ):
            a = tk.Checkbutton(box1, text="{0} ({1})".format(l2, l1), onvalue=l1, variable=ssbanda1)
            a.pack(side=tk.TOP, fill=tk.X)

    #repeat 2 more times for `ssbanda2` and `ssbanda3`

    #button to call `cambiar` func to print
        boton1 = tk.Button(top_frame, text="Aceptar", command= cambiar)
        boton1.pack(side=tk.BOTTOM, fill=tk.X)

        cambio.mainloop()

但是当我打印时我得到了 ssbanda1=0

之前我是这样创建长路的:

    a1 = tk.Checkbutton(box1, anchor= "w", text="(1)Banda Costera",         variable=ssbanda1, command= lambda: ssbanda1.set(1), onvalue=1).pack(side=tk.TOP, fill=tk.X)
    a2 = tk.Checkbutton(box1, anchor= "w",text="(2)Banda Azul",             variable=ssbanda1, command= lambda: ssbanda1.set(2), onvalue=2).pack(side=tk.TOP, fill=tk.X)
    a3 = tk.Checkbutton(box1, anchor= "w",text="(3)Banda Verde",            variable=ssbanda1, command= lambda: ssbanda1.set(3), onvalue=3).pack(side=tk.TOP, fill=tk.X)
    a4 = tk.Checkbutton(box1, anchor= "w",text="(4)Banda Rojo",             variable=ssbanda1, command= lambda: ssbanda1.set(4), onvalue=4).pack(side=tk.TOP, fill=tk.X)
    a5 = tk.Checkbutton(box1, anchor= "w",text="(5)Banda NIR",              variable=ssbanda1, command= lambda: ssbanda1.set(5), onvalue=5).pack(side=tk.TOP, fill=tk.X)
    a6 = tk.Checkbutton(box1, anchor= "w", text="(6)Banda SWIR 1",          variable=ssbanda1, command= lambda: ssbanda1.set(6), onvalue=6).pack(side=tk.TOP, fill=tk.X)
    a7 = tk.Checkbutton(box1, anchor= "w",text="(7)Banda SWIR 2",           variable=ssbanda1, command= lambda: ssbanda1.set(7), onvalue=7).pack(side=tk.TOP, fill=tk.X)
    a8 = tk.Checkbutton(box1, anchor= "w",text="(8)Banda Pancromatica",     variable=ssbanda1, command= lambda: ssbanda1.set(8), onvalue=8).pack(side=tk.TOP, fill=tk.X)
    a9 = tk.Checkbutton(box1, anchor= "w",text="(9)Banda Cirrus",           variable=ssbanda1, command= lambda: ssbanda1.set(9), onvalue=9).pack(side=tk.TOP, fill=tk.X)

但是不能使用 lambda 来做到这一点,因为它会在循环中每次 ssbanda1 覆盖并始终打印 ssbanda1=9

已经在单独的脚本中尝试 运行 循环并且工作完美,但在我的程序中没有,已经检查过 this and this。 我必须使用 self 表达式吗? global变量?在外面使用cambiar函数?

这是window:

TL;DR: 我正在尝试将 9 行优化为 1 个循环,但 IntVar 在按钮的回调函数中没有更新

问题是您不止一次创建了 Tk 的实例。每个都有自己的私有命名空间,一个中的小部件和变量不能被另一个共享。

如果您需要多个 window,请创建 Toplevel 的实例而不是 Tk 的多个实例。

这可能不是唯一的问题,但这是一个非常大的问题,在解决之前没有必要进一步调查。