为什么不鼓励使用 Tk 的多个实例?

2024-11-21 08:33:00
admin
原创
3
摘要:问题描述:考虑下面的例子:import tkinter as tk root = tk.Tk() root.title("root") other_window = tk.Tk() other_window.title("other_window") root.m...

问题描述:

考虑下面的例子:

import tkinter as tk

root = tk.Tk()
root.title("root")

other_window = tk.Tk()
other_window.title("other_window")

root.mainloop()

另请参见下面的示例,该示例Tk连续创建实例而不是一次创建实例,因此在任何给定时间都只有一个实例:Tk

import tkinter as tk

def create_window(window_to_be_closed=None):
    if window_to_be_closed:
        window_to_be_closed.destroy()
    window = tk.Tk()
    tk.Button(window, text="Quit", command=lambda arg=window : create_window(arg)).pack()
    window.mainloop()

create_window()
  • 为什么拥有多个实例被认为是不好的Tk

  • 第二段代码是否更好一些,或者它是否面临与第一段代码相同的情况?


解决方案 1:

为什么拥有多个实例被认为是不好的Tk

Tkinter 只是一个嵌入 Tcl 解释器的 Python 包装器,它导入了 Tk 库。创建根窗口时,会创建 Tcl 解释器的实例。

每个 Tcl 解释器都是一个独立的沙箱。一个沙箱中的对象不能与另一个沙箱中的对象交互。最常见的表现是,StringVar在一个解释器中创建的对象在另一个解释器中不可见。小部件也是如此——您不能在一个解释器中创建另一个解释器中作为父小部件的小部件。图像是第三种情况:在一个解释器中创建的图像不能在另一个解释器中使用。

从技术角度来看,没有理由不能Tk同时拥有两个实例。不建议这样做是因为实际上很少需要拥有两个或更多不同的 Tcl 解释器,而且这会导致初学者难以理解的问题。

第二段代码是否更好一些,或者它是否面临与第一段代码相同的情况?

如果不知道您要实现什么,就无法判断问题中的第二个示例是否更好。它可能并没有什么更好,因为您很少真正需要两个实例。

99.9% 的最佳解决方案是只创建一个实例,Tk供程序使用。如果您需要第二个或后续窗口,请创建实例Toplevel。很简单,这就是 tkinter 和底层 Tcl/Tk 解释器的设计用途。

解决方案 2:

我不同意tkinter社区不鼓励使用多个tk.Tk窗口。您可以拥有多个tk.Tk窗口。使用多个实例tk.Tk是创建真正相互独立的窗口的唯一方法。大多数人在创建多个窗口时犯的唯一错误是他们忘记在创建s/ s/ s/...时tk.Tk传入master=...`PhotoImageStringVarIntVar`

例如看看这个代码:

import tkinter as tk

root = tk.Tk()
root2 = tk.Tk()

variable = tk.StringVar() # Add `master=root2` to fix the problem
entry = tk.Entry(root2, textvariable=variable)
entry.bind("<Return>", lambda e: print(repr(variable.get())))
entry.pack()

root.mainloop()

上面的代码不起作用。如果你将 添加master=root2tk.StringVar(),那么它将完美地工作。这是因为存储了tkinter的第一个实例。然后如果你不传入,它会假定你想要 中的窗口。tk.Tk()`tk._default_rootmaster=...tk._default_root`


.mainloop()人们犯的另一个错误是应该调用多少次。它处理来自所有tk.Tk活动窗口的事件,因此您只需要一个.mainloop()

对于那些不同意的人,我感兴趣的是一个由多个窗口导致实际问题的例子tk.Tk

解决方案 3:

到目前为止我发现的最佳参考是tkinterbook的应用程序窗口部分:

在我们迄今为止使用的简单示例中,屏幕上只有一个窗口;根窗口。当您调用Tk构造函数时,它将自动创建

如果需要创建其他窗口,可以使用Toplevel小部件。它只是在屏幕上创建一个新窗口,该窗口的外观和行为与原始根窗口非常相似

我的看法是,一个Tk实例会创建一个Toplevel小部件,以及诸如此类的东西mainloop,其中应该只有一个。

解决方案 4:

Tk()初始化隐藏的 tcl 解释器,以便代码可以运行,因为 Tkinter 只是 tcl/tk 的包装器。它还会自动创建一个新窗口。只创建一个新窗口,如果尚未实例化,Toplevel()它将无法工作,因为它需要初始化的 tcl 解释器。您无法在不实例化的情况下创建任何 Tkinter 小部件,而 Toplevel 只是一个小部件。在问题中,您使用来创建第二个窗口。您应该创建另一个文件,因为多次初始化 tcl 解释器可能会造成混淆,正如@Bryan Oakley 很好地解释的那样。然后你应该这样做:Tk()`Tk()Tk()Tk()`

`from os import startfile
startfile(nameOfTheOtherFile)`

,因为,它Toplevel()只是一个小部件,当Tk()窗口关闭时,它也会关闭。将另一个窗口放在单独的文件中可以减少混乱。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用