我的代码有一个问题-它工作得很好,除了创建的按钮不是单独工作的事实,每个按钮都依赖于其他按钮。你能帮我使这些按钮独立吗?我希望我已经很好地描述了一切,英语不是我的母语:d这是代码:
import Tkinter as tk
import wiringpi2 as wiringpi
pin_base = 65
i2c_addr = 0x20
pin_base_2 = 81
i2c_addr_2 = 0x21
pin_base_3 = 97
i2c_addr_3 = 0x22
pin_base_4 = 113
i2c_addr_4 = 0x23
pin_base_5 = 129
i2c_addr_5 = 0x24
pin_base_6 = 145
i2c_addr_6 = 0x25
pin_base_7 = 161
i2c_addr_7 = 0x26
pin_base_8 = 177
i2c_addr_8 = 0x27
wiringpi.wiringPiSetup()
wiringpi.mcp23017Setup(65,0x20)
wiringpi.mcp23017Setup(81,0x21)
wiringpi.mcp23017Setup(97,0x22)
wiringpi.mcp23017Setup(113,0x23)
wiringpi.mcp23017Setup(129,0x24)
wiringpi.mcp23017Setup(145,0x25)
wiringpi.mcp23017Setup(161,0x26)
wiringpi.mcp23017Setup(177,0x27)
NUM_MY_WIDGETS = 6
wiring_mode = [65, 66, 67, 68, 69, 70]
class MyWidget(object):
def __init__(self, row, column, label_text):
self.button = tk.Button(text='WL', width=12, bg='red',
command=self.__call__)
self.button.grid(row=row, column=column)
self.label = tk.Label(text=label_text, width=6, bg='red')
self.label.grid(row=row, column=column+1)
def __call__(self):
if self.button['text'] == 'WL':
self.button['text'] = 'WYL'
self.label['bg'] = 'green'
wiringpi.pinMode(wiring_mode[i],0)
wiringpi.digitalWrite(wiring_mode[i],0)
else:
self.button['text'] = 'WL'
self.label['bg'] = 'red'
wiringpi.pinMode(wiring_mode[i],1)
wiringpi.digitalWrite(wiring_mode[i],0)
root = tk.Tk()
root.title('GUI - TEST')
widgets = []
for i in range(NUM_MY_WIDGETS):
widgets.append(MyWidget(i, 1, i+1))
root.mainloop()发布于 2015-09-20 05:21:05
我没有wiringpi2,所以我注释掉了所有依赖它的代码。当我运行生成的脚本时,我得到了6个按钮,如果我单击其中任何一个按钮,该按钮的文本和颜色都会改变,但其他按钮保持不变。我想这就是应该发生的事情。因此,我猜测问题与线路有关:
wiringpi.pinMode(wiring_mode[i],0)
wiringpi.digitalWrite(wiring_mode[i],0)这里的i是一个全局变量,所有的按钮都将使用相同的值。您需要将数字保存在小部件中。在您的初始化方法中,您只需添加
self.i = row然后只需设置
i = self.i在call()方法的开头。
下面是一个最小的例子
import Tkinter as tk
NUM_MY_WIDGETS = 6
class MyWidget(object):
def __init__(self, row, column, label_text):
self.button = tk.Button(text='WL', width=12, bg='red',
command=self.__call__)
self.button.grid(row=row, column=column)
self.label = tk.Label(text=label_text, width=6, bg='red')
self.label.grid(row=row, column=column+1)
self.i = row
def __call__(self):
if self.button['text'] == 'WL':
self.button['text'] = 'WYL'
self.label['bg'] = 'green'
print(self.i)
else:
self.button['text'] = 'WL'
self.label['bg'] = 'red'
print(i)
root = tk.Tk()
root.title('GUI - TEST')
widgets = []
for i in range(NUM_MY_WIDGETS):
widgets.append(MyWidget(i, 1, i+1))
root.mainloop()当颜色变为绿色时,将打印按钮编号,但当颜色变为红色时,将始终打印"5“。
当定义call时,python不保存i的当前值。它保存对变量i的引用。当稍后运行call时,所使用的值是我在调用时恰好具有的值,而不是它在定义时具有的值。
https://stackoverflow.com/questions/32670921
复制相似问题