Форум сайта python.su
Здравствуйте!
Прошу оказать помощь. Мне удалось написать программу для управления реле на Raspberry Pi, но не удаётся правильно написать код так чтобы каждая кнопка могла выполнять два действия (сравнивать состояние реле и менять его состояние на противоположное), а также вид самой кнопки. ниже прилагаю код, опыт проводил только над первой кнопкой.
За ранее благодарю.
Прикреплённый файлы:
rele3.py (4,5 KБ)
Офлайн
По идее вы тут должны не кнопку использовать а чекбокс.
На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Офлайн
doza_andПодскажите пожалуйста на примере одной кнопки. Дальше я сам отредактирую.
По идее вы тут должны не кнопку использовать а чекбокс.На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Офлайн
Подскажите прошу почему нет реакции на события кнопок, код не выдаёт ошибки.
Прикреплённый файлы:
rele none GPIO 2.py (3,6 KБ)
Офлайн
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)
Офлайн
doza_andОгромное человеческое спасибо! Буду изучать данный код чтобы понять его каждое значение. Постараюсь дописать команды управления портами GPIO на Raspbbery Pi.
Офлайн
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()
Офлайн
Вот мой тестовый код для 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)
Офлайн