python - 在python中使用tkinter从顶层窗口关闭主窗口

标签 python python-3.x tkinter

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

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

我的代码可以正常工作,但我确信有更好或更聪明的方法来实现它。

为了使其工作,我必须在“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()

最佳答案

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

具体来说,它提供了 askyesno 对话框,该对话框负责新窗口的打开/关闭,并在用户单击Yes时返回True > 和 False(如果用户单击)。然后,您可以简单地使用 if 语句来关闭窗口(如果用户这么说),只需使用 self.main.destroy() (无需声明 root作为全局)。

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()

注释

  1. 标准对话框中的“是/否”按钮已本地化,这意味着它们会被翻译成您的计算机设置所使用的语言。
  2. 如果您查看一下 messagebox 模块,您会发现还有其他标准对话框。恕我直言,在这种情况下,我会使用 askyescancel,它的使用方式完全相同,但看起来更语义化。

关于python - 在python中使用tkinter从顶层窗口关闭主窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546457/

相关文章:

python - 使用 Flask 获取 int 列表并将这些值作为端点返回

Python3,被三整除,类型错误

python - Python Tkinter 中.xxxxxxx 的含义是什么

python - 如何更新 Canvas 上的图像?

javascript - 如何使 SJCL 和 Python hashlib 生成相同的 pdkdf2 输出

python - PyQt5 - 传递的引用为 None

python - Python 有流式正则表达式模块吗?

python - 有没有办法在 Python 中中断 shutil copytree 操作?

python - 如何在Python中浏览图像并显示它?

python - 建议在 python 中使用独特的随机字符串生成器??