【发布时间】:2015-03-04 00:14:03
【问题描述】:
这是一个示例情况:
我编写了一个 tk GUI,可以打开和编辑例如.txt 文件。我目前在 Mac 上,但我可能也想在 Windows 上运行它。目前主应用程序类创建自己的内部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 上一样,但这会用重复的图标填充 Dock 并且与系统的其余部分不一致。
这是我想出的可能方法: 多个 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 窗口和多个 Toplevels(需要隐藏 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 中是否有一种普遍接受的方法?
【问题讨论】:
-
您是否有任何最小的工作代码来演示您的问题,或者您如何使用顶层等。我们更容易重现您的问题。
-
我不认为这是一个与设计决策一样多的问题。但是是的,我会准备一些代码并编辑问题
-
您可以查看 Python 内置 IDLE 编辑器的源代码 (hg.python.org/cpython/file/3.4/Lib/idlelib)。它使用 tkinter 并且具有我理解您正在尝试做的特性,即在一个应用程序实例中创建和/或编辑多个文件并在 OS X、Windows 和通用 Unix/Linux 平台上运行。特别是,请查看hg.python.org/cpython/file/3.4/Lib/idlelib/macosxSupport.py中针对 IDLE 的 OS X 特定自定义
标签: python macos user-interface python-3.x tkinter