主要问题是这四行代码:
frameNames[len(frameNames) - 1] = Frame(app)
frameNames[len(frameNames) - 1].pack()
...
createWidgetButton = Button(app, text="createWidgets", command=createwidgets())
createWidgetButton.grid(sticky=S)
您正在将框架和按钮创建为app
,但你正在使用grid
对于一和pack
对于另一个。您必须与所有直系后代保持一致app
- 他们必须全部使用pack
或者他们都必须使用grid
.
第二个问题是这一行:
frameNames += (str("g"+str(len(frameNames)))) #why does the letter & number get added as seperate elements?
Here, frameNames
是一个列表,您正在尝试用字符串添加它。添加与附加不同。您需要追加新名称,或者在添加之前将新名称放入临时列表中。
frameNames.append(str(...))
第三个问题是这一行:
createWidgetButton = Button(app, text="createWidgets", command=createwidgets())
上面的内容和下面的完全一样:
result = createWidgets()
createWidgetButton = Button(app, text="createWidgets", command=result)
你必须通过一个参考到一个函数,而不是call功能。将行更改为此(请注意后面缺少括号createWidgets
):
createWidgetButton = Button(app, text="createWidgets", command=createwidgets)
与问题无关,但你的代码是much如果您使用临时变量而不是重复模式,则更容易阅读(str("w"+str(len(widgetNames)-1)
。正如所写的,您的代码几乎无法阅读。另外,您不想存储小部件names,您需要存储实际的小部件本身。
最后,不要进行通配符导入。根本没有充分的理由这样做。
这是我重写你的代码的方式:
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()