gpt4 book ai didi

python - 制作不与父关闭的 tkinter 顶层窗口

转载 作者:太空狗 更新时间:2023-10-30 01:34:35 24 4
gpt4 key购买 nike

我应该如何在 tkinter 中生成子 Toplevel() 窗口,当父窗口关闭时不会关闭?

我是否需要让父级保留子窗口的“引用计数”、拦截 WM_DELETE_WINDOW 并且仅在所有子级都消失时才调用 root.destroy()

或者用它自己的 tk mainloop 生成另一个 thread 进程是否可以接受?

或者有更优雅的方式吗?

编辑

我目前是这样做的

root = Tk()
app = App(root) # doesn't call Toplevel()
root.mainloop()

其中 App.__init__() 在不调用 Toplevel() 的情况下将小部件添加到 root,并在某些时候生成一个新窗口功能:

def new_window():
root = Tk()
window = App2(root) # doesn't call Toplevel() either

请注意 new_window() 中的 root 是与原始 root 不同的变量,通过对 Tk( )

所有这一切似乎都在做正确的事,即子窗口独立于父窗口存在,python 进程在两者都关闭后死亡。

所以我的问题是,这是否有意义,或者我在这里做错了什么?

最佳答案

您不必跟踪哪些 Toplevel 处于事件状态,您可以使用 weakref在哨兵上——只是传递给每个 Toplevel 并保存在引用中的一些对象。当每个 Toplevel 死亡(关闭)时,让它删除它对哨兵的引用。当对哨兵的最后一个引用被删除时,weakref 回调,self.no_sentinel 将被自动调用,进而为您调用 root.destroy

import Tkinter as tk
import weakref


class Sentinel(object):
pass


class Window(tk.Toplevel):
def __init__(self, master, sentinel, **kwargs):
title = kwargs.pop('title')
self.sentinel = sentinel
tk.Toplevel.__init__(self, master, **kwargs)
self.protocol("WM_DELETE_WINDOW", self.ondelete)
self.label = tk.Label(self, text=title)
self.label.pack(padx=10, pady=10)

def ondelete(self):
self.destroy()
del self.sentinel


class App(object):
def __init__(self, master, **kwargs):
self.master = master
sentinel = Sentinel()
parent = Window(master, sentinel, title='Parent')
child = Window(master, sentinel, title='Child')
self._ref = weakref.ref(sentinel, self.no_sentinel)
# When we exit `__init__` only two strong references to sentinal
# remain -- in parent and child. When both strong references are
# deleted, `self.no_sentinel` gets called.
def no_sentinel(self, *args):
self.master.destroy()

root = tk.Tk()
root.withdraw()
app = App(root)
root.mainloop()

或者,您可以使用multiprocessing 模块来产生另一个进程来创建另一个 Tkinter 窗口和主循环,但是会比上面的解决方案消耗更多的内存,并且会如果您希望单独的进程共享信息,则需要您设置某种形式的进程间通信。

关于python - 制作不与父关闭的 tkinter 顶层窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17043317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com