函数在Python中使用数组变量命名循环中的按钮

2024-09-29 06:22:43 发布

您现在位置: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]
]

这是有效的:

^{pr2}$

当尝试调整其中一个按钮的状态时,将返回一个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()的需要。在

有人有什么想法吗?在


Tags: 函数windows数组vars按钮附带one命名
1条回答
网友
1楼 · 发布于 2024-09-29 06:22:43

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

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

也没有好的理由使用placeplace有它的优点,但它们很少。如果您使用packgrid,那么您的GUI将更易于编写和维护。就计算器而言,grid是一个非常自然的选择。另外,试图在数据结构中定义布局是很麻烦的。我不确定它是否有任何真正的价值,因为你不太可能创建一个通用算法,可以创建不同编号系统的计算器。在

我建议将小部件的布局与小部件的创建分开。根据我的经验,这只会使GUI开发更容易。在

^{pr2}$

另外,我建议不要使用像“zer”这样的名字,把一个四个字母的单词缩写成三个字母是没有任何价值的。在

相关问题 更多 >