如何在新创建的窗口中的复选框中设置Tkinter中的变量

时间:2016-01-22 10:16:12

标签: python python-2.7 checkbox 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。

2 个答案:

答案 0 :(得分: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的值。目前,每次打开选项窗口时都会重新创建它们,这意味着它们始终采用默认值。

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

答案 1 :(得分:1)

尽管将变量设置为1,但选项1开始未选中的原因是因为option_var1open_settings函数的局部变量,一旦函数完成option_var1被删除且复选框丢失他们的参考。您只需添加一个全局声明即可解决此问题:

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

虽然option_var1在创建后保留引用的任何情况(无论如何都需要对设置执行任何操作)也会修复引用问题。