Форум сайта python.su
0
Здравствуйте!
Прошу оказать помощь. Мне удалось написать программу для управления реле на Raspberry Pi, но не удаётся правильно написать код так чтобы каждая кнопка могла выполнять два действия (сравнивать состояние реле и менять его состояние на противоположное), а также вид самой кнопки. ниже прилагаю код, опыт проводил только над первой кнопкой.
За ранее благодарю.
Прикреплённый файлы:
rele3.py (4,5 KБ)
Офлайн
253
По идее вы тут должны не кнопку использовать а чекбокс.
На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Офлайн
0
doza_andПодскажите пожалуйста на примере одной кнопки. Дальше я сам отредактирую.
По идее вы тут должны не кнопку использовать а чекбокс.На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Офлайн
0
Подскажите прошу почему нет реакции на события кнопок, код не выдаёт ошибки.
Прикреплённый файлы:
rele none GPIO 2.py (3,6 KБ)
Офлайн
253
Rauf
Подскажите прошу почему нет реакции на события кнопок
RaufОчень даже выдает. Как вы смотрите? Смотрите в консоли что получается.
код не выдаёт ошибки.
from time import sleep from tkinter import * def R10Quit(event): global root root.destroy() def R1Off(event): print ("SYSTEM OFF") def R1On(event): print ("RELAY 1 - ON") [code python][/code] def R2Off(event): print ("RELAY 2 - OFF") def R2On(event): print ("RELAY 2 - ON") def R3Off(event): print ("RELAY 3 - OFF") def R3On(event): print ("RELAY 3 - ON") ....
from Tkinter import * def Quit(event): global root root.destroy() def R9Reset(event): print ("SYSTEM SHUTDOWN") class pts: def __init__(self,msg): self.msg=msg def __call__(self,event): print(self.msg) root = Tk() def bb(txt,i,j,f=None,bg='black'): btn = Button(root, text=txt,width=25,heigh=2,bg=bg,fg='red',font='arial 16') btn.grid(row=i, column=j) if f is None: f=pts(txt) btn.bind("<Button-1>",f) return btn rbtn=[[bb("Relay {} ON".format(i+1),i,0),bb("Relay {} OFF".format(i+1),i,1)] for i in range(8)] last=[bb("RESET",i+1,0,R9Reset,'grey'),bb("QUIT",i+1,1,Quit,'grey')] root.title('Relay Button') root.mainloop()
Отредактировано doza_and (Янв. 26, 2016 21:32:55)
Офлайн
0
doza_andОгромное человеческое спасибо! Буду изучать данный код чтобы понять его каждое значение. Постараюсь дописать команды управления портами GPIO на Raspbbery Pi.
Офлайн
0
doza_andУвы извилин не хватило на Ваш код. Мне необходима помощь в корректировки кода над одной кнопкой.
from time import sleep from tkinter import * import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(16, GPIO.IN) GPIO.setup(18, GPIO.IN) GPIO.setup(11, GPIO.OUT) GPIO.setup(12, GPIO.OUT) GPIO.setup(13, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.setup(31, GPIO.OUT) GPIO.setup(33, GPIO.OUT) GPIO.setup(35, GPIO.OUT) GPIO.setup(37, GPIO.OUT) root = Tk() rele1 = int(0) rele2 = int(0) rele3 = int(0) rele4 = int(0) rele5 = int(0) rele6 = int(0) rele7 = int(0) rele8 = int(0) z = int(1) def buta1(event): for rele1 in range (0, 1): if rele1 == 0: print ("RELE 1 - ON") GPIO.output(11, 0) but1.configure(text='Rele 1 - ON',bg='green',fg='red',font='arial 16') rele1 = rele1 + 1 break else: print ("RELE 1 - OFF") GPIO.output(11, 1) but1.configure(text='Rele 1 - OFF',bg='black',fg='red',font='arial 16') rele1 = rele1 - 1 def buta2(event): print ("RELE 2 - ON") GPIO.output(12, 0) but2.configure(text='Rele 2 - ON',bg='green',fg='red',font='arial 16') def buta3(event): print ("RELE 3 - ON") GPIO.output(13, 0) but3.configure(text='Rele 3 - ON',bg='green',fg='red',font='arial 16') def buta4(event): print ("RELE 4 - ON") GPIO.output(15, 0) but4.configure(text='Rele 4 - ON',bg='green',fg='red',font='arial 16') def buta5(event): print ("RELE 5 - ON") GPIO.output(31, 0) but5.configure(text='Rele 5 - ON',bg='green',fg='red',font='arial 16') def buta6(event): print ("RELE 6 - ON") GPIO.output(33, 0) but6.configure(text='Rele 6 - ON',bg='green',fg='red',font='arial 16') def buta7(event): print ("RELE 7 - ON") GPIO.output(35, 0) but7.configure(text='Rele 7 - ON',bg='green',fg='red',font='arial 16') def buta8(event): print ("RELE 8 - ON") GPIO.output(37, 0) but8.configure(text='Rele 8 - ON',bg='green',fg='red',font='arial 16') def buta9(event): print ("SYSTEM OFF") but9.configure(bg='red') GPIO.output(11, GPIO.HIGH) sleep(0.1) GPIO.output(12, GPIO.HIGH) sleep(0.1) GPIO.output(13, GPIO.HIGH) sleep(0.1) GPIO.output(15, GPIO.HIGH) sleep(0.1) GPIO.output(31, GPIO.HIGH) sleep(0.1) GPIO.output(33, GPIO.HIGH) sleep(0.1) GPIO.output(35, GPIO.HIGH) sleep(0.1) GPIO.output(37, GPIO.HIGH) sleep(0.1) but1.configure(text='Rele 1 - OFF',bg='black',fg='red',font='arial 16') but2.configure(text='Rele 2 - OFF',bg='black',fg='red',font='arial 16') but3.configure(text='Rele 3 - OFF',bg='black',fg='red',font='arial 16') but4.configure(text='Rele 4 - OFF',bg='black',fg='red',font='arial 16') but5.configure(text='Rele 5 - OFF',bg='black',fg='red',font='arial 16') but6.configure(text='Rele 6 - OFF',bg='black',fg='red',font='arial 16') but7.configure(text='Rele 7 - OFF',bg='black',fg='red',font='arial 16') but8.configure(text='Rele 8 - OFF',bg='black',fg='red',font='arial 16') but9.configure(text='RESET',bg='black',fg='red',font='arial 16') but1 = Button(root, text='Rele 1 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but1.bind("<Button-1>",buta1) but1.grid(row=0,column=1) but1.pack(side=TOP) but2 = Button(root, text='Rele 2 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but2.bind("<Button-1>",buta2) but2.grid(row=1,column=1) but2.pack(side=TOP) but3 = Button(root, text='Rele 3 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but3.bind("<Button-1>",buta3) but3.grid(row=2,column=1) but3.pack(side=TOP) but4 = Button(root, text='Rele 4 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but4.bind("<Button-1>",buta4) but4.grid(row=3,column=1) but4.pack(side=TOP) but5 = Button(root, text='Rele 5 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but5.bind("<Button-1>",buta5) but5.grid(row=4,column=1) but5.pack(side=TOP) but6 = Button(root, text='Rele 6 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but6.bind("<Button-1>",buta6) but6.grid(row=5,column=1) but6.pack(side=TOP) but7 = Button(root, text='Rele 7 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but7.bind("<Button-1>",buta7) but7.grid(row=6,column=1) but7.pack(side=TOP) but8 = Button(root, text='Rele 8 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16') but8.bind("<Button-1>",buta8) but8.grid(row=7,column=1) but8.pack(side=TOP) but9 = Button(root, text='RESET',width=25,heigh=2,bg='black',fg='red',font='arial 16') but9.bind("<Button-1>",buta9) but9.pack(side=TOP) root.mainloop()
Офлайн
4
Вот мой тестовый код для RPi.GPIO, только ui сделан на Kivy. Но принцип создания кнопок в цикле думаю понятен.
ps. почему-то режутся переносы( с нормальным форматированием
from kivy.app import App from kivy.uix.stacklayout import StackLayout from kivy.uix.togglebutton import ToggleButton from kivy.logger import Logger try: import RPi.GPIO as GPIO Logger.info('GPIO lib installed and initialized') GPIO_SETTINGS = { '16': GPIO.IN, '18': GPIO.IN, '11': GPIO.OUT, '12': GPIO.OUT, '13': GPIO.OUT, '15': GPIO.OUT, '31': GPIO.OUT, '33': GPIO.OUT, '35': GPIO.OUT, '37': GPIO.OUT, } except (ImportError, RuntimeError): # это для теста на десктопе Logger.error('GPIO lib not installed') GPIO = None GPIO_SETTINGS = { '16': None, '18': None, '11': None, '12': None, '13': None, '15': None, '31': None, '33': None, '35': None, '37': None, } class TestApp(App): def on_start(self): if GPIO: GPIO.setmode(GPIO.BOARD) for k, v in GPIO_SETTINGS.items(): GPIO.setup(int(k), v) else: Logger.warning('GPIO lib not initialized') def build(self): lay = StackLayout() for k, v in GPIO_SETTINGS.items(): tb = ToggleButton(id=k, text=k, size_hint=(None, 0.15)) tb.bind(state=self.on_button) lay.add_widget(tb) return lay def on_button(self, instanse, value): relay_state = 1 if instanse.state == 'down' else 0 if GPIO: Logger.info('GPIO [{0}] set to {1}'.format(instanse.id, relay_state)) GPIO.output(int(instanse.id), relay_state) else: Logger.warning('GPIO [{0}] not set to {1}'.format(instanse.id, relay_state)) Logger.warning('GPIO lib not initialized') if __name__ == '__main__': TestApp().run()
Отредактировано den4ik (Май 4, 2016 09:26:59)
Офлайн