如何关闭Tkinter窗口并保留StringVar值?

时间:2018-02-12 19:19:39

标签: python tkinter

我遇到以下代码的几个问题:

  1. 选择单选按钮并选择确定按钮后,Tkinter窗口不会关闭。我已经尝试了各种方法来关闭Tkinter窗口 - quit()destroy() buttonAction()以及master.mainloop()之后 - 但两者都没有效果。代码将无休止地运行,窗口不会关闭。
  2. 运行代码后,不会保留compGDB变量赋值。此时,我想知道compGDB变量是否因为销毁/退出代码失败而不能保留。
  3. import Tkinter, getpass
    username = getpass.getuser()
    
    def buttonAction():
        compGDB = choice.get()
        print compGDB
        #master.quit()
        #master.destroy()
    
    vwrMinGDB = "C:\\Users\\" + username + "\\Desktop\\ViewerAttribution\\Viewer_minimum.gdb"
    fullGDB = "C:\\Users\\" + username + "\\Desktop\\ViewerAttribution\\Full_geodatabase.gdb"
    
    master = Tkinter.Tk()
    master.title("Schema comparison")
    master.geometry("250x100")
    
    choice = Tkinter.StringVar()
    choice.set(vwrMinGDB)
    
    chooseOption = Tkinter.Label(master, text="Slect geodatabase for schema comparison")
    rButton1 = Tkinter.Radiobutton(master, text="Viewer Minimum Attribution", variable=choice, value=vwrMinGDB)
    rButton2 = Tkinter.Radiobutton(master, text="Full Geodatabase Attribution", variable=choice, value=fullGDB)
    confirmButton = Tkinter.Button(master, text="OK", command=buttonAction)
    
    chooseOption.grid(column="1", row="0")
    rButton1.grid(column="1", row="1")
    rButton2.grid(column="1", row="2")
    confirmButton.grid(column="1", row="3")
    
    master.mainloop()
    #master.quit()
    #master.destroy()
    

    谢谢,你们!

1 个答案:

答案 0 :(得分:0)

我无法重现您的第一个问题。您可以quit()master.quit()内拨打def buttonAction():,但是应该还有其他内容丢失。

你的第二个问题是因为compGDB在函数buttonAction中是locally created,所以一旦完成了这个功能,属性就不再存在了。

虽然更好的建议是将代码重建为class并将compGDB定义为实例/类属性(因此只要该类,您就可以调用它实例仍然在内存中),你可以看到它可能有点工作。一个简单的解决方法(IMO不是最佳实践)将是:

compGDB = ''

def buttonAction():
    global compGDB
    compGDB = choice.get()
    master.quit()

这样,全局属性compGDB仍然保留,即使在master.mainloop()之后,您也可以在任何地方调用它。

但是,如果您之后使用了该信息,请考虑对tkinter使用OOP方法。它可以帮助您更轻松地维护命名空间,尤其是对于复杂的脚本。