在python中用tkinter关闭来自顶层窗口的主窗口

时间:2017-04-21 15:22:31

标签: python python-3.x tkinter

这是我的第一个问题,我是python和这个网站的新手。

我正在设计一个与数据库交互的应用程序。我添加了一个“关闭”按钮,我想打开一个新窗口,询问“关闭程序?”和2个按钮:是和否。单击“否”时,将关闭新窗口。当您单击“是”时,两个窗口都会关闭。

我的代码正常运行,但我确信有更好或更聪明的方法。

为了使它工作,我必须在“close_window”方法中编写“root.destroy()”,但我很确定有一种更聪明的方法可以获得与“self.master.destroy()”类似的结果“它使用了python的所有功能。我在下面展示了代码的简化版本。

提前致谢。

阿方索

from tkinter import *

class Window():

    def __init__(self, main):
        self.main = main

        self.b5=Button(self.main, text="Action 1", width=12)
        self.b5.grid(row=0, column=1)

        self.b5=Button(self.main, text="Action 2", width=12)
        self.b5.grid(row=0, column=2)

        self.b6=Button(self.main, text="Close", width=12, command=self.new_window)
        self.b6.grid(row=0, column=3)

    def new_window(self):
        self.newWindow = Toplevel(self.main)
        self.app = Demo2(self.newWindow)

    def close_window(self):
        root.destroy()


class Demo2:
    def __init__(self, master):
        self.master = master
        self.frame = Frame(self.master)

        self.l1=Label(self.frame, text="Close the program?")
        self.l1.grid(row=0, column=0, columnspan=2)

        self.b1=Button(self.frame, text="Yes", command=self.yes_com)
        self.b1.grid(row=1, column=0)

        self.b1=Button(self.frame, text="No", command=self.no_com)
        self.b1.grid(row=1, column=1)

        self.frame.pack()

    def yes_com(self):
        self.master.destroy()
        Window.close_window(self)

    def no_com(self):
        self.master.destroy()


def main():
    global root
    root = Tk()
    app = Window(root)
    root.mainloop()

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:1)

您可以简单地使用messagebox模块提供的标准对话框。

具体来说,它提供askyesno对话框,负责打开/关闭新窗口,如果用户点击True则会返回Yes,如果是False则返回No用户点击if。然后,如果用户只是使用self.main.destroy()(而不需要将root声明为global),则可以使用from tkinter import * from tkinter import messagebox class Window(): def __init__(self, main): self.main = main self.b5=Button(self.main, text="Action 1", width=12) self.b5.grid(row=0, column=1) self.b5=Button(self.main, text="Action 2", width=12) self.b5.grid(row=0, column=2) self.b6=Button(self.main, text="Close", width=12, command=self.close_window) self.b6.grid(row=0, column=3) def close_window(self): if messagebox.askyesno('Close', 'Close the program?'): self.main.destroy() def main(): root = Tk() app = Window(root) root.mainloop() if __name__ == '__main__': main() - 语句关闭窗口。

messagebox

备注

  1. 标准对话框中的是/否按钮是已本地化,这意味着它们已被翻译为计算机设置使用的语言。
  2. 如果查看askyescancel模块,您会看到还有其他标准对话框。恕我直言,在这种情况下,我会使用Parallel.ForEach,它以完全相同的方式使用,但似乎更具语义。

答案 1 :(得分:1)

Pier Paolo有正确的答案,但为了科学,这里是你问题的直接答案:

def yes_com(self):
    self.master.master.destroy() # <this class instance>.<toplevel instance>.<Tk instance>.destroy()

或者你可以简单地退出python:

import sys

def yes_com(self):
    sys.exit()