这是一个示例情况:
我写了一个可以打开和编辑的 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/