当窗口对象被封装时,如何关闭一个窗口



好,这是我正在做的一个更大的项目,所以如果它看起来很乱,我很抱歉。

问题是,当我点击GUI上的"退出程序"按钮时,窗口仍然处于活动状态。当我点击窗口右上角的"x"时,我知道按钮正在工作;程序关闭,因此运行变量被设置回0,这将阻止代码循环。

我的问题是,当退出按钮被点击时,我如何让窗口自动关闭,因为root.destroy()方法没有这样做。

#imports
from tkinter import *
import random, pickle, shelve
#global vars
run = 0
class Window(Frame):
#the class that manages the UI window
    def __init__(self, master, screen_type = 0):
        """Initilize the frame"""
        super(Window, self).__init__(master)
        self.grid()
        if screen_type == 1:
            self.log_in_screen()
    def log_in_screen(self):
        #Program Exit Button
        self.exit = Button(self, text = " Exit Program ", command = self.end)
        self.exit.grid(row = 3, column = 0, columnspan = 2, sticky = W)
    def end(self):
        global run, root
        run = 0
        root.destroy()
#Main Loop
def main():
    global run, root
    run = 1
    while run != 0:
        root = Tk()
        root.title("Budget Manager - 0.6.1")
        root.geometry("400x120")
        screen = Window(root, screen_type = run)
        root.mainloop()
store = shelve.open("store.dat", "c")
main()
store.close()

我的问题是我如何让窗口自动关闭时退出按钮被点击,因为root.destroy()方法没有被点击这样做。

答案是:在根窗口上调用destroy()。你说它不起作用,但是你发布的代码似乎起作用了,而destroy()的文档所做的正是你描述的你想要发生的事情:它会破坏窗口。你的代码在循环中创建新的顶层窗口,所以可能只有出现不起作用,因为旧窗口id被销毁,而新窗口在眨眼之间被创建。

看起来你真正想问的是"我怎么才能让点击"x"和点击"退出程序"按钮一样?"如果是这样的话,答案很简单,即使你的非常规代码在循环中创建根窗口。

要使窗口框架上的"x"按钮调用函数而不是破坏窗口,请使用wm_protocol方法和"WM_DELETE_WINDOW"常量以及您希望它调用的函数。

例如:

while run != 0:
    root = Tk()
    ...
    screen = Window(root, screen_type = run)
    root.wm_protocol("WM_DELETE_WINDOW", screen.end)
    ...
    root.mainloop()

您可以做如下操作。我在我自己的项目中使用过它,它很有效。

Mywin =tkinter.Tk()
def exit():
    Mywin.quit()
    # etc.

相关内容

  • 没有找到相关文章

最新更新