在for循环中创建和调用变量

时间:2017-11-06 17:30:31

标签: python loops variables tkinter

我试图让用户输入一个数字,并创建了多个按钮使用TKinter,我尝试使用以下内容,成功创建按钮的位置,但是我正在努力调用它们是为了放置它们/将它们显示在网格上(添加了randint来模拟用户输入(用户输入不限于9,可能高达40))

from tkinter import *
from random import randint
inputValue = randint(3,9)
print(inputValue)
root = Tk()
while inputValue > 0: # for every number in inputted value
    inputValue = int(inputValue) - 1 # take one
    globals()['Sailor%s' % inputValue] = Button(root, text="Lap :" + str(inputValue), command=lambda: retrieve_input())  # Create the button function in the format 'Sailors{Inputnumber}'
    ('Sailors%s' % inputValue).grid(row=inputValue, column=1, columnspan=2)  # Place the button (Doesn't work)
root.mainloop()  # Does work (required)

以下不起作用(意味着放置按钮),

('Sailors%s' % inputValue).grid(row=inputValue, column=1, columnspan=2)  # Place the button (Doesn't work)

你能想到我可以用来创建和放置按钮数量的方法吗? 提前致谢

2 个答案:

答案 0 :(得分:0)

此时您可以在字符串上调用网格,这会引发您的错误。

您需要将('Sailors%s' % inputValue)替换为globals()['Sailor%s' % inputValue],并在各行上按下您的按钮,标记为0-8。

因此,您当前的代码是:

from tkinter import *
from random import randint
inputValue = randint(3,9)
print(inputValue)
root = Tk()
while inputValue > 0: # for every number in inputted value
    inputValue = int(inputValue) - 1 # take one
    globals()['Sailor%s' % inputValue] = Button(root, text="Lap :" + str(inputValue), command=lambda: retrieve_input())  # Create the button function in the format 'Sailors{Inputnumber}'
    globals()['Sailor%s' % inputValue].grid(row=inputValue, column=1, columnspan=2)  
root.mainloop()  # Does work (required)

定义retrieve_input时,代码可以正常工作。

要指出的是,您可以使用inputValue = int(inputValue) - 1而不是inputValue -= 1

答案 1 :(得分:0)

您永远不应该像尝试那样创建动态变量名。它增加了很多复杂性,降低了清晰度,并没有带来真正的好处。

而是使用字典或列表来跟踪按钮。但是,在你的情况下,由于你从不在任何地方使用按钮,只能在循环中使用本地变量。

使用局部变量的示例,以防您在创建它之后永远不需要访问代码中的按钮:

for count in range(inputValue):
    button = Button(...)
    button.grid(...)

如果您需要稍后在代码中访问按钮,请执行以下操作:

buttons = []
for count in range(inputValue):
    button = Button(...)
    button.grid(...)
    buttons.append(button)

通过上述内容,您可以遍历buttons中的所有按钮:

for button in buttons:
    button.configure(state='disabled')

如果您需要配置单个按钮,请使用其索引:

button[0].configure(...)