Tkinte:遍历图像对象并设置itemconfigure

时间:2018-05-30 23:09:25

标签: python tkinter

我创建了一堆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')

1 个答案:

答案 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], ...)