<p>主要问题是这四行代码:</p>
<pre><code>frameNames[len(frameNames) - 1] = Frame(app)
frameNames[len(frameNames) - 1].pack()
...
createWidgetButton = Button(app, text="createWidgets", command=createwidgets())
createWidgetButton.grid(sticky=S)
</code></pre>
<p>您创建的框架和按钮都是作为<code>app</code>的子级创建的,但是您使用的是<code>grid</code>,另一个使用<code>pack</code>。您必须与<code>app</code>的所有直接后代一致-它们必须全部使用<code>pack</code>或者必须全部使用<code>grid</code>。在</p>
<p>第二个问题是这条线:</p>
^{pr2}$
<p>这里,<code>frameNames</code>是一个列表,您正试图用字符串添加它。添加与附加不同。您需要附加新名称,或者在添加新名称之前将其放入临时列表中。在</p>
<pre><code>frameNames.append(str(...))
</code></pre>
<p>第三个问题是这条线:</p>
<pre><code>createWidgetButton = Button(app, text="createWidgets", command=createwidgets())
</code></pre>
<p>以上内容与此完全相同:</p>
<pre><code>result = createWidgets()
createWidgetButton = Button(app, text="createWidgets", command=result)
</code></pre>
<p>必须将引用传递给函数,而不是调用函数。将行改为这样(注意<code>createWidgets</code>后面缺少括号):</p>
<pre><code>createWidgetButton = Button(app, text="createWidgets", command=createwidgets)
</code></pre>
<hr/>
<p>与问题无关,但是如果使用临时变量而不是重复模式<code>(str("w"+str(len(widgetNames)-1)</code>,则代码将更易于阅读。如前所述,您的代码几乎无法阅读。另外,您不想存储widget<em>名称</em>,您需要存储实际的widget本身。在</p>
<p>最后,不要执行通配符导入。根本没有好的理由去做。在</p>
<p>下面是我如何重写您的代码:</p>
<pre><code>import Tkinter as tk
app = tk.Tk()
frames = []
widgets = []
def createwidgets():
global widgetNames
global frameNames
frame = tk.Frame(app, borderwidth=2, relief="groove")
frames.append(frame)
frame.pack(side="top", fill="x")
for i in range(3):
widget = tk.Entry(frame)
widgets.append(widget)
widget.pack(side="left")
createWidgetButton = tk.Button(app, text="createWidgets", command=createwidgets)
createWidgetButton.pack(side="bottom", fill="x")
app.mainloop()
</code></pre>