Tkinter 从按钮动态创建小部件

2024-01-06

我正在尝试制作一个动态 GUI,其中单击按钮会创建一个新框架,该框架放置在按钮上方,其中包含 3 个条目小部件(用户选项),并且我需要能够从中读取用户输入3 个条目小部件并可能更改它们。每次按下按钮时,都会出现三个新的可调用条目小部件。

我知道这是错误的,因为它一直给我带来错误,但是可以使用类似于列表的东西来动态创建小部件吗?

from Tkinter import *

app = Tk()

frameNames = []
widgetNames = []

def createwidgets():
    global widgetNames
    global frameNames
    frameNames += (str("g"+str(len(frameNames))))  #why does the letter & number get added as seperate elements?
    widgetNames += [(str("w"+str(len(widgetNames)-1))), 
                    (str("w"+str(len(widgetNames)))),    
                    (str("w"+str(len(widgetNames)+1)))]

    frameNames[len(frameNames) - 1] = Frame(app)
    frameNames[len(frameNames) - 1].pack()

    widgetNames[len(widgetNames) - 3] = Entry(frameNames[len(frameNames) - 1])
    widgetNames[len(widgetNames) - 3].pack()
    widgetNames[len(widgetNames) - 2] = Entry(frameNames[len(frameNames - )- 1])
    widgetNames[len(widgetNames) - 2].pack()
    widgetNames[len(widgetNames) - 1] = Entry(frameNames[len(frameNames) - 1])
    widgetNames[len(widgetNames) - 1].pack()

createWidgetButton = Button(app, text="createWidgets", command=createwidgets())
createWidgetButton.grid(sticky=S)

app.mainloop()

主要问题是这四行代码:

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tkinter 从按钮动态创建小部件 的相关文章

随机推荐