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 中创建变量作为实例属性。
这是一个示例情况:
我写了一个 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 中创建变量作为实例属性。