我试图让用户输入一个数字,并创建了多个按钮使用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)
你能想到我可以用来创建和放置按钮数量的方法吗? 提前致谢
答案 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(...)