我创建了一堆OVALS。并定义了一个在FOR中使用的变量(w_oval)。 Itemconfigure不接受此变量。关于不可变变量的东西?如何为itemconfigure定义变量?我知道我在这里错过了一些哲学。
b1_oval = bottom_frame.create_oval( 25,180,65,205, fill='')
b2_oval = bottom_frame.create_oval( 25,180,65,205, fill='')
#... more bn_oval
i_oval = 0
w_oval = ''
ovalLONG = [-90,-75,-60,-45,-30,-15,0,15,30,45,60,75,90]
for j in ovalLONG:
i_oval = i_oval + 1
w_oval = str('b'+str(i_oval)+'_oval') # Not flying Wilbur
if i == j:
bottom_frame.itemconfigure(w_oval, fill='goldenrod3')
答案 0 :(得分:0)
考虑这行代码:
b1_oval = bottom_frame.create_oval( 25,180,65,205, fill='')
在上面的代码中,create_oval
返回一个整数标识符,表示创建的对象。您将其存储在名为b1_oval
的变量中。
现在考虑以下代码:
for j in ovalLONG:
i_oval = i_oval + 1
w_oval = str('b'+str(i_oval)+'_oval') # Not flying Wilbur
if i == j:
bottom_frame.itemconfigure(w_oval, fill='goldenrod3')
首先,您要创建一个看起来像"b1_oval"
的字符串。您将此字符串存储在名为w_oval
的变量中。换句话说,它与你w_oval = "b1_oval"
没有什么不同。
当你致电itemconfigure(w_oval, ...)
时,它与调用`itemconfigure(" b1_oval",...)完全相同。
画布将第一个参数作为标记或id。由于它不是整数,因此将其视为标记。您没有在画布上使用标记“" b1_oval"”创建任何对象,因此没有任何更改。需要明确的是:标签和变量名称是两个完全不同的东西。
您有以下两种选择之一:为每个椭圆提供一个与该模式匹配的标记(通过tag
选项),或者以可在循环中使用的方式存储ID。
在我看来,这些解决方案中的第二个是最好的和最简单的。而不是创建一组名称中包含数字的变量,而是将ID存储在列表或字典中。然后它只是一个简单的查找,而不必计算变量的名称。
例如:
ovals = []
ovals.append(bottom_frame.create_oval(...))
ovals.append(bottom_frame.create_oval(...))
...
for j in ovalLONG:
if i == j:
bottom_frame.itemconfigure(ovals[i], ...)
我怀疑上述内容正是您想要的,因为我不知道您在哪里计算i
- 它不在您提供的代码中。不过,重点是您将对象ID保存在列表中,而不是尝试计算变量名称。
使用列表的主要缺点是您无法控制索引。列表始终从零开始计数,因此即使您要在ovals[0]
开始计数,您创建的第一个椭圆也始终为1
。
另一个选择是使用字典而不是列表,它允许您使用任意名称或数字作为椭圆,并且不要求它们是线性的。
ovals = {}
ovals[1] = bottom_frame.create_oval(...)
ovals[100] = bottom_frame.create_oval(...)
...
i = 100
...
bottom_frame.itemconfigure(ovals[i], ...)