首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查tkinter GUI

检查tkinter GUI
EN

Stack Overflow用户
提问于 2015-09-20 01:03:09
回答 1查看 71关注 0票数 0

我的代码有一个问题-它工作得很好,除了创建的按钮不是单独工作的事实,每个按钮都依赖于其他按钮。你能帮我使这些按钮独立吗?我希望我已经很好地描述了一切,英语不是我的母语:d这是代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2015-09-20 05:21:05

我没有wiringpi2,所以我注释掉了所有依赖它的代码。当我运行生成的脚本时,我得到了6个按钮,如果我单击其中任何一个按钮,该按钮的文本和颜色都会改变,但其他按钮保持不变。我想这就是应该发生的事情。因此,我猜测问题与线路有关:

代码语言:javascript
复制
wiringpi.pinMode(wiring_mode[i],0)
wiringpi.digitalWrite(wiring_mode[i],0)

这里的i是一个全局变量,所有的按钮都将使用相同的值。您需要将数字保存在小部件中。在您的初始化方法中,您只需添加

代码语言:javascript
复制
self.i = row

然后只需设置

代码语言:javascript
复制
i = self.i

在call()方法的开头。

下面是一个最小的例子

代码语言:javascript
复制
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时,所使用的值是我在调用时恰好具有的值,而不是它在定义时具有的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32670921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档