2016-01-22 26 views
1

如果我在根窗口中,但我无法在新创建的窗口中设置变量,一切都很好。它总是给我默认的空复选框。我还有一个问题,那就是如何保存选择的选项,因此当我打开选项(设置)窗口时,同样的选项将被选中或取消选中。如何在新创建的窗口中的复选框中设置Tkinter中的变量

from Tkinter import * 

# TKINTER CODE ######################################################################## # 

root = Tk() 
root.title('window') 
Label(text='input').grid(row=0, sticky=W, padx=10, pady=10) 

entry = Entry(root, width=50) 
entry.grid(row=1, sticky=W+E, padx=10, pady=10) 
entry.insert(0, "input") 

text = Text(root, width=80, state=DISABLED) 
text.grid(row=2, column=0, sticky=W, padx=0, pady=0) 

scrollbar = Scrollbar(root) 
scrollbar.grid(row=2, column=1, sticky=N+S+W+E) 
scrollbar.config(command=text.yview) 

# Settings window 


def open_settings(): 
    settings_win = Toplevel(root) 
    settings_win.title('Settings') 
    settings_win.geometry('300x300') 
    settings_win.resizable(width=FALSE, height=FALSE) 
    settings_win_button.config(state='disable') 

    def close_settings_window(): 
     settings_win.destroy() 
     settings_win_button.config(state='normal') 

    # options to choose from 
    option_var1 = IntVar() 
    # Make default position to be checked 
    option_var1.set(1) 

    option_var2 = IntVar() 

    option1 = Checkbutton(settings_win, text="option1", variable=option_var1) 
    option1.grid(row=0, column=0) 

    option2 = Checkbutton(settings_win, text="option2", variable=option_var2) 
    option2.grid(row=1, column=0) 

    quit_settings_button = Button(settings_win, text='Save', command=close_settings_window) 
    quit_settings_button.grid(row=10, column=0) 

    settings_win.protocol("WM_DELETE_WINDOW", close_settings_window) 

settings_win_button = Button(root, text='Options', command=open_settings) 
settings_win_button.grid(row=0, column=0) 

# Menu Bar ############################################################################ # 
menubar = Menu(root) 

# create a pulldown menu, and add it to the menu bar 
filemenu = Menu(menubar, tearoff=0) 
# filemenu.add_separator() 
filemenu.add_command(label="Exit", command=root.quit) 
menubar.add_cascade(label="File", menu=filemenu) 

helpmenu = Menu(menubar, tearoff=0) 
menubar.add_cascade(label="Help", menu=helpmenu) 

# display the menu 
root.config(menu=menubar) 

# End ################################################################################# # 

root.mainloop() 

我希望option1在新创建的窗口中进行检查。

回答

1

尝试添加一行root.wait_window(settings_win)settings_win.protocol...行之后:

settings_win.protocol("WM_DELETE_WINDOW", close_settings_window) 
root.wait_window(settings_win) 

我觉得发生了什么是运行事件循环仍在努力处理root窗口,所以它是不会主动更新Toplevelwait_window将做什么是create a local event looproot现在将等待Toplevel被销毁以继续处理。这迫使Toplevel不断更新,这意味着将检查默认值option1

但是,您需要在某处存储值option_var1option_var2。目前,每次打开选项窗口时都会重新创建它们,这意味着它们始终采用其默认值。

希望这可以帮助您解决您的问题。

+0

工程很好。感谢帮助。 – Gunnm

1

的选项1开始的原因,尽管变量设置为1选中是因为option_var1是一个局部变量的open_settings功能,一旦函数结束option_var1被删除,复选框,失去了参考。你可以简单地通过增加一个全球性的语句解决这个问题:

def open_settings(): 
    global option_var1,option_var2 
    .... 

虽然该option_var1保持创建后的参考也将修复参考问题(这是做反正设置任何需要的)任何情况下。

+0

感谢您的回答。如果可能的话,我想避免使用全局变量, – Gunnm

+0

我也是这样,但是您计划保留控制变量以在程序中使用它的任何方式都可以使用,但如果您不处于项目的当前阶段,那么全局声明将在开发过程中发挥作用。 –