<p>不能创建<code>tkinter.Tk</code>的两个实例。如果你这样做,两件事中的一件会发生。在</p>
<p>脚本中的大多数代码可能无法运行,因为它正在等待模块的<code>mainloop</code>完成,直到您退出为止。在</p>
<p>如果结构不同,最终将得到两个<code>Tk</code>实例,其中只有一个实际正在运行。脚本中的一些代码会碰巧找到正确的<code>Tk</code>实例(或者在封面下正确的实际Tk对象),因为有很多共享的全局内容只是假设“某处或其他地方”存在一个Tk并设法找到。但是其他代码会找到错误的代码,并且没有任何效果。或者,有时候,事情会产生错误的影响,或者导致崩溃,谁知道呢。在</p>
<p>您需要将顶级应用程序放在一个地方,无论是模块还是使用它的脚本,然后让另一个地方从那里访问它。在</p>
<hr/>
<p>一种方法是编写模块,使其代码可以用<code>Tk</code>实例调用。然后,使用<code>__main__</code>技巧,这样,如果您直接将模块作为脚本运行(而不是从另一个脚本导入它),它将创建一个<code>Tk</code>实例并调用该代码。这里有一个非常简单的例子。在</p>
<p>在tkmodule.py公司名称:</p>
<pre><code>from tkinter import *
def say_hi():
print("Hello, world!")
def create_interface(window):
hi = Button(window, text='Hello', command=say_hi)
hi.pack()
if __name__ == '__main__':
root = Tk()
create_interface(root)
root.mainloop()
</code></pre>
<p>在tkscript.py公司名称:</p>
^{pr2}$
<p>现在,当您运行<code>tkscript.py</code>时,它拥有一个<code>Tk</code>实例,并将其传递给自己的<code>create_frame</code>和{<cd11>}。但是如果您只运行<code>tkmodule.py</code>,<em>它</em>拥有一个<code>Tk</code>实例,并将其传递给自己的<code>create_frame</code>。不管怎样,只有一个<code>Tk</code>实例和一个主循环,每个人都可以使用它。在</p>
<p>请注意,如果需要两个顶级窗口,则必须在某处显式地创建一个<code>Toplevel</code>。(而且您不希望总是在<code>tkmodule.py</code>中创建一个,或者当您运行模块本身时,它将创建一个新窗口,并将默认窗口保留为空。)</p>
<hr/>
<p>当然,一种更简单的方法是将所有的GUI内容放入那些从不创建自己的<code>Tk</code>实例的模块中,并编写导入相应模块并驱动它们的脚本。在</p>