为了向Python自我介绍,我决定复制Windows附带的基本计算器。 我已经设法解决了最初的问题,即使用vars()函数来命名通过循环创建的单个按钮,并使用存储在数组中的变量命名(我知道有些草率)。 但是,当我将循环封装在一个函数中时,这是行不通的。

数组:

controls = [
    ["zer", "0", 0, 18, 150, 30, 70],
    ["one", "1", 1, 18, 115, 30, 35],
    ["two", "2", 2, 54, 115, 30, 35]
]

这有效:

for b in controls:
    vars()[b[0]] = Button(calc, text=b[1], command=lambda inp=b[2]:click(inp))
    vars()[b[0]].place(x=b[3], y=b[4], height=b[5], width=b[6])

尝试调整按钮之一的状态时,这将返回NameError:

def setButtons(buttons)
    for b in buttons:
        vars()[b[0]] = Button(calc, text=b[1], command=lambda inp=b[2]:click(inp))
        vars()[b[0]].place(x=b[3], y=b[4], height=b[5], width=b[6])

setButtons(controls)

我知道数组正在传递给函数,因为按钮仍然会生成并且表现良好。 这是我在使用vars()函数之前遇到的确切问题,因此我猜测这将是范围界定的问题。 我还应该注意,我还没有研究字典的使用,我担心字典可能会完全解决此问题并消除使用vars()的需要。

有人有想法么?

#1楼 票数:0 已采纳

没有理由使用vars 简单的解决方案是将所有小部件存储在字典中:

self.buttons = {}
for b in controls:
    self.buttons[b[0]] = Button(...)

也没有充分的理由使用place - place具有其优势,但它们之间相距甚远。 如果使用packgrid则GUI的编写和维护将更加容易。 对于计算器, grid是非常自然的选择。 另外,尝试在数据结构中定义布局也很麻烦。 我不确定它有什么真正的价值,因为您不太可能创建一个通用算法来创建具有不同编号系统的计算器。

我建议将小部件的布局与小部件的创建分开。 以我的经验,这只是使GUI开发变得更容易。

self.buttons["zer"].grid(row=3, column=0, columnspan=2, sticky="nsew")
self.buttons["two"].grid(row=2, column=0, sticky="nsew")
self.buttons["thr"].grid(row=2, column=1, sticky="nsew")
...

另外,我建议不要使用“ zer”之类的名称-将四个字母的单词缩写为三个字母确实没有任何价值。

  ask by Amazingly Vacant translate from so

未解决问题?本站智能推荐:

2回复

如何在创建多个按钮的循环中将按钮命令中的变量设置为拥有按钮的文本?[重复]

这个问题在这里已经有了答案: Tkinter 使用 lambda 循环分配按钮命令(1 个回答) 去年关闭。 我有一个循环,它在包含列表值的标签下创建一个按
1回复

将功能分配给在Tkinter中for循环中创建的按钮[重复]

这个问题已经在这里有了答案: tkinter在for循环中创建按钮传递命令参数 2个答案 我有一个for循环,它根据列表的长度(compkeys)创建一定数量的按钮(在tkinter中)。 当我按下每个按钮时,会获得一个先前制作的功能,该功能需要一个输入。 我正在尝试使函数
1回复

tkinter中循环中按钮上的图像[关闭]

关闭。 这个问题需要细节或清晰。 它目前不接受答案。 想改善这个问题吗? 通过编辑此帖子添加详细信息并澄清
2回复

如何使用for循环为按钮提供功能?

所以我想使用一个for循环给Tkinter中的按钮一个功能。 当我这样做时,我得到了错误消息,这些按钮没有定义。 我尝试了几件事,但无论如何我都没有工作。 如果您能帮助我,我会很高兴。 顺便说一句,它是一个计算器。 这是循环的样子: 这就是我制作按钮的方式:
1回复

未使用的变量“按钮”pylint(未使用的变量)

我正在通过tkinter模块创建一个简单的井字游戏。 而且似乎有一个未使用的变量“按钮” pylint(未使用的变量) 在我的代码的以下部分中: 请注意,上面的代码在方法内部,因此在缩进形式内。
1回复

使用Tkinter中的按钮更改变量的值(Python)

我想在单击任何一个登录或注册按钮时更改一个变量,以便打开适当的tkinter窗口来创建一个要求登录或注册的窗口。 当我运行此代码并单击注册时,它不会更改变量的值。我在做什么错? 另外,如果有更好的方法询问用户该怎么做,请提及。 PS-如果您想查看此gui类或登录和注册类的完整代码,请告诉
1回复

Python:数组中的按钮命令

我正在尝试简化计算器的代码。 我没有为每个按钮编写代码,而是尝试将其全部放入 for 循环中,但事实证明,让按钮实际上具有单独的命令是很困难的。 目前代码如下: 只用一个 for 循环就可以了,但是添加第二个来创建数组就不行了。 如何让每个按钮正常工作/注册?
1回复

for循环中的按钮可更新for循环中的标签?

尝试获取单个按钮以更新 tkinter 中的单个标签。 这是我的代码: 当您运行代码时,下一列中三个标签旁边的列中有三个按钮。 我想要做的是得到它,以便每个按钮改变它旁边的标签。 当我运行代码时,每个按钮都会修改最后一个标签,而其他两个标签则保持不变。 任何帮助都很棒,谢谢!