tkinter 上的多个 application/file/windows 个实例 运行

Multiple application/file/windows instances running on tkinter

这是一个示例情况:

我写了一个 tk GUI 可以打开和编辑例如.txt 文件。我目前正在 mac,但我可能还想 运行 windows。目前主应用程序 class 创建自己的内部 tk.Tk() 就像这样

    import tkinter as tk

class App:
    def __init__(self):
        self.root = tk.Tk()
        tk.Label(master=self.root,text="content").pack()

if __name__ == '__main__':
    a=App()
    a.root.mainloop()

我想为应用程序添加多文件功能。在当前系统中,这将导致 2 tk.Tk() 个实例 运行ning,我无法开始工作,人们说这是不可预测的。

我希望能够关闭多个文件中的任何一个并且仍然有应用程序 运行ning 直到最后一个 window 关闭然后应用程序退出或保持没有 window(就像 mac)。

我的问题是,如果我为我的每个 windows 使用 tk.Toplevel() 我有一个难看的默认值 tk.Tk() window 我需要隐藏哪些不雅的接缝.确定哪个文件当前处于菜单栏操作的焦点也会很麻烦。

我也在考虑每个文件都是它自己的应用程序实例,就像在 Windows 上一样,但这会使停靠栏充满重复的图标,并且与系统的其余部分不一致。

以下是我想出的可能方法: 多个 Tks(可行,但更复杂的示例无法预测):

import tkinter as tk

class App:
    def __init__(self):
        self.root = tk.Tk()
        tk.Label(master=self.root,text="content").pack()
        tk.Button(master=self.root,text="new_window",command=self.open).pack()

    def open(self):
        App()

if __name__ == '__main__':
    a=App()
    a.root.mainloop()

隐藏 tk window 和多个 Toplevel(需要隐藏 Tk 和 osx 菜单栏命令,如 view->change_colors 需要手动决定将命令定向到哪里):

import tkinter as tk

class App:
    def __init__(self):
        self.root = tk.Toplevel()
        tk.Label(master=self.root,text="content").pack()
        tk.Button(master=self.root,text="new_window",command=self.open).pack()

    def open(self):
        App()

if __name__ == '__main__':
    tk.Tk()
    a=App()
    a.root.mainloop()

每个 Window 都是自己的应用程序并且完全独立(不适合与其他 mac 应用程序,实现很丑陋):

#!/usr/local/bin/python3
import tkinter as tk
import sys,os

class App:
    def __init__(self):
        self.root = tk.Tk()
        tk.Label(master=self.root,text="content").pack()
        tk.Button(master=self.root,text="new_window",command=self.open).pack()

    def open(self):
        os.system(sys.argv[0]+"&")

if __name__ == '__main__':
    a=App()
    a.root.mainloop()

我也想过用线程来做,但我想我一定是想多了所以我来了。 在 tk 中是否有普遍接受的方法?

普遍接受的方法就像你描述的那样:使用Toplevel额外的windows,如果你不想看到它,则隐藏根window。

另一种选择是让您的主程序成为非 GYI 应用程序,并且每个 window 都是通过生成一个新进程来创建的。

Hidden tk window and multyple Toplevels (Needs hiding the Tk and the osx menubar commands like view->change_colors would need to manaly decide where to direct comands):

很容易进入 "which goes with what" 多个 Toplevel 的地狱。而是为每个新的 Toplevel 创建一个单独的 class,内置对按钮点击等的响应。将 "root" 传递给 class 并让它根据需要创建、更新和销毁,并保留跟踪它自己的变量。如果您想在别处使用变量,则在调用 Toplevel classes 时存储 class 实例,并在 class 中创建变量作为实例属性。