python - 在 tkinter 上运行的多个应用程序/文件/windows 实例

标签 python macos user-interface python-3.x tkinter

这是一个示例情况:

我写了一个可以打开和编辑的 tk GUI,例如.txt 文件。我目前使用的是 Mac,但我可能还想在 Windows 上运行它。目前主要的 Application 类创建自己的内部 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() 实例运行,我无法开始工作,人们说这是不可预测的。

我希望能够关闭多个文件中的任何一个,并且仍然让应用程序运行,直到最后一个窗口关闭,然后应用程序退出或保持没有窗口(就像在 Mac 上一样)。

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

我也在考虑每个文件都是它自己的应用程序实例,就像在 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 窗口和多个 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()

每个窗口都是它自己的应用程序并且完全独立(不适合与其他 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 来添加额外的窗口,如果您不想看到它,则隐藏根窗口。

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

关于python - 在 tkinter 上运行的多个应用程序/文件/windows 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844491/

相关文章:

python - Python 类中的属性是否共享?

python - Pandas unstack 不起作用

macos - 如何在 MacOS Catalina 中创建运行 shell 脚本的应用程序包?

java:netbeans gui 按钮不能同时工作

python - 在 postgres 脚本中使用变量

python - 获取主机的所有外部IP地址

macos - 编码修改后的二进制文件 (Apple Silicon/M1)

macos - ld : library not found for -lgsl

Iphone UI 案例研究 - 满意度远程

java - 使用带 GUI 的 map