<p>问题的根源是您创建了多次<code>Tk</code>的实例。Tkinter应用程序只能有一个<code>Tk</code>类的实例,并且必须恰好调用一次<code>mainloop</code>。如果需要其他窗口,则应创建<code>Toplevel</code>(<a href="http://effbot.org/tkinterbook/toplevel.htm" rel="nofollow">http://effbot.org/tkinterbook/toplevel.htm</a>)的实例。在</p>
<p>如果您想用可重用代码创建模块,请让您的模块创建<code>Frame</code>(或者{<cd4>}的子类,如果您要创建dialos)。然后,主脚本将创建<code>Tk</code>的实例,并将这些框架放置在主窗口或子窗口中。在</p>
<p>如果您希望有时将模块用作可重用组件,有时用作可运行程序,请将“可运行程序”部分放入特殊的If语句中:</p>
<pre><code># module1.py
import Tkinter as tk
class Module1(tk.Frame):
def __init__(self, *args, **kwargs):
label = tk.Label(self, text="I am module 1")
label.pack(side="top", fill="both", expand=True)
# this code will not run if this module is imported
if __name__ == "__main__":
root = tk.Tk()
m1 = Module1(root)
m1.pack(side="top", fill="both", expand=True)
</code></pre>
<p>在上面的代码中,如果您像<code>python module1.py</code>那样运行它,那么最后一个if语句中的代码将运行。它将创建一个根窗口,创建一个框架实例,并使该框架填充主窗口。在</p>
<p>但是,如果将上述代码导入到另一个程序中,If语句中的代码将<em>而不是</em>运行,因此不会得到<code>Tk</code>的多个实例。在</p>
<p>假设您有两个类似于上面的模块,并且希望编写一个使用它们的程序,并且每个模块都应该放在一个单独的窗口中。您可以通过编写第三个脚本来实现这一点:</p>
^{pr2}$
<p>有了上面的代码,两个模块中的代码可以用三种方式使用:作为独立程序,作为单个窗口中的单独框架,或作为单独窗口中的单独框架。在</p>