【问题标题】:How can I make a tkinter Toplevel window dependent on another Toplevel window如何使 tkinter Toplevel 窗口依赖于另一个 Toplevel 窗口
【发布时间】:2020-12-16 16:06:12
【问题描述】:

如果我在 tkinter 应用程序中创建一个顶级弹出窗口,当我关闭主根窗口时,所有子窗口都会关闭。

使用以下代码,如果我打开两个连续的顶层窗口,我可以关闭“窗口一”但“窗口二”保持打开状态。

#!/usr/bin/env python3

import tkinter as tk
import tkinter.ttk as ttk

def main():
    root = tk.Tk()
    root.geometry("600x300")
    root.title("Main Window")
    app = Application(root)
    app.mainloop()

def window_one():
    window_one = WindowOne()
    window_one.geometry("450x200")
    window_one.title('Window One')

def window_two():
    window_two = WindowTwo()
    window_two.geometry("200x100")
    window_two.title('Window Two')


class Application(ttk.Frame):
    
    def __init__(self, master= None, *args, **kwargs):
        super().__init__(master = master)
        self.pack()
        self.create_widgets()
    
    def create_widgets(self):
        button1 = ttk.Button(self, text = "Click Here", command = window_one)
        button1.pack()


class WindowOne(tk.Toplevel):

    def __init__(self, master= None, *args, **kwargs):
        super().__init__(master = master)
        self.create_widgets()
    
    def create_widgets(self):
        button1 = ttk.Button(self, text = "Click Here", command = window_two)
        button1.pack()


class WindowTwo(tk.Toplevel):

    def __init__(self, master= None, *args, **kwargs):
        super().__init__(master = master)
        self.create_widgets()
    
    def create_widgets(self):
        button1 = ttk.Button(self, text = "$$$")
        button1.pack()

if __name__ == "__main__":
    main()

如何编写代码以使窗口二依赖于窗口一,这样如果我关闭“窗口一”,“窗口二”也会关闭,模仿主根窗口的行为?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您可以将Window One 设为Window Two 的父级:

    def window_two(parent):
        window_two = WindowTwo(parent) # pass parent to WindowTwo
        window_two.geometry("200x100")
        window_two.title('Window Two')
    
    ...
    
    class WindowOne(tk.Toplevel):
    
        def __init__(self, master= None, *args, **kwargs):
            super().__init__(master = master)
            self.create_widgets()
        
        def create_widgets(self):
            button1 = ttk.Button(self, text = "Click Here", command = lambda: window_two(self)) # pass self to `window_two()`
            button1.pack()
    

    更新:如果你想在Window Two被关闭的时候关闭Window One,你可以使用self.protocol("WM_DELETE_WINDOW", ...)

    class WindowTwo(tk.Toplevel):
    
        def __init__(self, master= None, *args, **kwargs):
            super().__init__(master = master)
            self.create_widgets()
            self.protocol("WM_DELETE_WINDOW", self.on_destroy)
        
        def create_widgets(self):
            button1 = ttk.Button(self, text = "$$$")
            button1.pack()
    
        def on_destroy(self):
            self.master.destroy() # close parent window
            self.destroy() # close itself
    

    或将<Destroy>事件绑定到回调以关闭父窗口:

    class WindowTwo(tk.Toplevel):
    
        def __init__(self, master= None, *args, **kwargs):
            super().__init__(master = master)
            self.create_widgets()
            self.bind("<Destroy>", self.on_destroy)
        
        def create_widgets(self):
            button1 = ttk.Button(self, text = "$$$")
            button1.pack()
    
        def on_destroy(self, event):
            self.master.destroy() # close parent window
    

    【讨论】:

    • 感谢您的回复。我做了正确的事情,但得到了“没有名为 tk 的属性”错误,多亏了你,我意识到我在创建窗口 2 时忘记将“self”作为参数传递。它运行良好。你实际上比我需要的更进一步,因为我不需要窗口 2 来杀死它的父级,但是感谢它是一个很好的回调示例,供我在时机成熟时参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2019-06-12
    • 2018-12-20
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多