繁体   English   中英

使用Python中的数组变量命名循环中按钮的功能

[英]Function to name buttons in a loop using array variables in Python

为了向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()的需要。

有人有想法么?

没有理由使用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”之类的名称-将四个字母的单词缩写为三个字母确实没有任何价值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM