Python / Tkinter:为什么IntVar的.get方法在点击不同的radiobuttons时会显示相同的值?

时间:2016-04-08 17:29:27

标签: python tkinter

该计划的简要概述:

  1. 启动脚本时,会出现对话框窗口并要求您选择目录路径(类MyApp
  2. 选择时 - 需要按下"开始监控"按钮。此操作将撤消主窗口(root)并初始化由两个框架组成的容器类FrameContainer,即PageOnePageTwo(请参阅相应的类)。
  3. Back Home上的按钮Page One应该销毁类FrameContainer的实例并再次显示对话框窗口。使用方法update()deiconify()
  4. 可以实现此操作
  5. 选择Page One上的任何单选按钮都应更改变量rb_indx的值 - 使用get() IntVar方法实现。{
  6. 问题:

    • 单选按钮以错误的方式初始化。 var.set(1)应突出显示' var1'按钮,但在我的情况下会突出显示var2var3
    • get() IntVar方法在选择单选按钮时不会更新变量rb_indx的值。 print rb_indx总是给出1
    • 当用[x]关闭PageOne窗口时(在屏幕的一角),对话框窗口没有出现,但预计会出现......

    代码:

    # -*- coding: utf-8 -*-
    
    try:
        # Python2
        import Tkinter as Tk
        from Tkinter import IntVar
        from tkFileDialog import askdirectory
    
    except ImportError:
        # Python3
        import tkinter as Tk
        from tkinter import IntVar
        from tkinter.filedialog import askdirectory
    
    LARGE_FONT=("Verdana", 12)
    
    ########################################################################
    
    class FrameContainer(Tk.Tk):
    
        def __init__(self, parent):
    
            self.original_frame = parent   
    
            Tk.Tk.__init__ (self)
            container = Tk.Frame(self)
    
            container.pack(side="top", fill="both", expand = True)
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight =1)
    
            self.frames = {}
    
            for F in (PageOne, PageTwo): 
    
                frame = F(container, self)
                self.frames[F] = frame
                frame.grid(row=0, column=0, sticky="nsew")
    
            self.show_frame(PageOne)
    
        def show_frame (self, cont):
    
            frame=self.frames[cont]
            frame.tkraise()
    
        def onClose(self):
    
            self.destroy()
            self.original_frame.show()  
    
    class PageOne(Tk.Frame):
    
        def __init__(self, parent, controller):
    
            Tk.Frame.__init__(self, parent)
    
            label = Tk.Label(self, text="Page One", font=LARGE_FONT)
            label.pack(pady=10, padx=10)
    
            button1=Tk.Button(self, text="Back to Home", command=lambda: controller.onClose())
            button1.pack()
    
            button2=Tk.Button(self, text="Page Two", command=lambda: controller.show_frame(PageTwo))
            button2.pack()
    
            def get_button_indx(): 
    
                global rb_indx
                rb_indx=var.get()
                print rb_indx
    
            var.set(1)
    
            names_tuple = ('var1', 'var2', 'var3')
    
            for col_numb in range (1,len(names_tuple)+1):
                radio = Tk.Radiobutton(self, text=names_tuple[col_numb-1], variable=var, value=col_numb, command=get_button_indx)
                radio.pack()
    
    class PageTwo(Tk.Frame):
    
        def __init__(self, parent, controller):
    
            Tk.Frame.__init__(self, parent)
    
            label = Tk.Label(self, text="Page Two", font=LARGE_FONT)
            label.pack(pady=10, padx=10)
    
            button1=Tk.Button(self, text="Back to Home", command=lambda: controller.onClose())
            button1.pack()
    
            button2=Tk.Button(self, text="Page One", command=lambda: controller.show_frame(PageOne))
            button2.pack()
    
    class MyApp(object):
    
        def __init__(self, parent):
    
            self.root = parent
            self.root.title("Start page")
            self.frame = Tk.Frame(parent)
            self.frame.pack()
    
            def choosedir():   
    
                global path_usr_var 
                path_usr_var = askdirectory()
                print path_usr_var
    
            button1 = Tk.Button(self.frame, text="Select Directory", command=choosedir)
            button1.pack(pady=10, padx=10)
    
            button2 = Tk.Button(self.frame, text="Start Monitoring", command=self.openFrame)
            button2.pack(pady=10, padx=10)
    
        def hide(self):
            self.root.withdraw()
    
        def openFrame(self):
            self.hide()
            firstFrame = FrameContainer(self)
    
        def show(self):
            self.root.update()
            self.root.deiconify()
    
    ########################################################################
    
    if __name__ == "__main__":
    
        root = Tk.Tk()
        root.geometry("800x600")
        var = IntVar()
        app = MyApp(root)
        root.mainloop()
    

1 个答案:

答案 0 :(得分:1)

问题是您正在创建多个Tk的实例。应用程序必须只有一个Tk实例。发生的事情是var属于第一个实例,但是您将它与属于第二个实例的单选按钮相关联。

如果您需要多个窗口,请创建一个根窗口,然后为所有其他窗口创建Toplevel的实例。