【问题标题】:Multiple application/file/windows instances running on tkinter在 tkinter 上运行的多个应用程序/文件/Windows 实例
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    隐藏 tk 窗口和多个顶层(需要隐藏 Tk 和 osx 菜单栏命令,如 view->change_colors 需要手动决定将命令指向何处):

    使用多个顶层很容易陷入“与什么相配”的地狱。而是为每个新的 Toplevel 创建一个单独的类,内置响应按钮点击等。将“root”传递给该类,并让它根据需要创建、更新和销毁,并跟踪它自己的变量。如果要在其他地方使用变量,则在调用顶级类时存储类实例,并在类中创建变量作为实例属性。

    【讨论】:

    • 您能否详细说明一下这句话:“很容易进入”这与“地狱与多个 Toplevels 相去甚远。”?您所说的“与什么相配”是什么意思?为什么您会有多个相同的窗口类——或者您是否打算为每个新的顶层...编写“创建一个单独的实例”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2013-05-09
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多