Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2018 18:41:18

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

Доброго времени суток!
Прошу прощения, если вопрос откровенно нубский.
На базе Raspberry pi написал хотел создать простую программу, позволяющую при нажатии на определенную клавишу клавиатуры зажигать светодиод, а с ее отпусканием - гасить. Казалось бы, все просто.

 from tkinter import *
import tkinter.font
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
GPIO.output(37, GPIO.LOW)
GPIO.setup(38, GPIO.OUT)
GPIO.output(38, GPIO.LOW)
GPIO.setup(36, GPIO.OUT)
GPIO.output(36, GPIO.LOW)
win = Tk()
myFont = tkinter.font.Font(family = 'Helvetica', size = 26, weight = 'bold')
def ledON(self):
  print("LED button pressed")
  GPIO.output(37,GPIO.HIGH)
  ledButton["text"] = "LED OFF"
def ledON3(self):
        print("LED button nopressed")
        GPIO.output(37,GPIO.LOW)
        ledButton["text"] = "LED ON"
def ledON1(self):
        print("LED button1 pressed")
        GPIO.output(38,GPIO.HIGH)
        ledButton1["text"] = "LED1 OFF"
def ledON4(self):
        print("LED button1 nopressed")
        GPIO.output(38,GPIO.LOW)
        ledButton1["text"] = "LED1 ON"
def ledON2(self):
        print("LED button2 pressed")
        GPIO.output(36,GPIO.HIGH)
        ledButton2["text"] = "LED2 OFF"
def ledON5(self):
        print("LED button2 nopressed")
        GPIO.output(36,GPIO.LOW)
        ledButton2["text"] = "LED2 ON"
def exitProgram(self):
        print("Exit Button pressed")
        GPIO.cleanup()
        win.quit()	
win.title("First GUI")
win.geometry('800x480')
exitButton  = Button(win, text = "Exit", font = myFont, command = exitProgram, height =2 , width = 6) 
exitButton.pack(side = BOTTOM)
ledButton = Button(win, text = "LED ON", font = myFont, command = ledON, height = 2, width = 6 )
ledButton.pack( side = RIGHT , padx = 10 , pady = 10 , ipadx = 10 , ipady = 10 )
ledButton1 = Button(win, text = "LED ON1", font = myFont, command = ledON1, height = 2, width = 6 )
ledButton1.pack( side = LEFT, padx = 10 , pady = 10 , ipadx = 10 , ipady = 10 )
ledButton2 = Button(win, text = "LED ON2", font = myFont, command = ledON2, height = 2, width = 6 )
ledButton2.pack()
win.bind('i', ledON2 )
win.bind('j', ledON1 )
win.bind('l', ledON )
win.bind('k', exitProgram )
win.bind('<KeyRelease-l>', ledON3 )
win.bind('<KeyRelease-j>', ledON4 )
win.bind('<KeyRelease-i>', ledON5 )
mainloop()
Если привязывать событие к виртуальной кнопке, то все нормально. Если же к клавиатуре, то лампочка моргает в режиме генератора, и видно, что для программы кнопка постоянно то нажимается, то отжимается, хотя она непрерывно нажата. С чем это связано, и как с этим бороться?
Прошу помощи уважаемых гуро

Офлайн

#2 Янв. 5, 2018 19:27:58

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

tkinter GPIO

автоповтор идет

 from tkinter import *
root = Tk()
root.geometry('600x600+0+0') 
canv = Canvas(bg='green')
canv.pack(fill=BOTH,expand=1)
rect = canv.create_rectangle(100,100,200,200,fill='red') 
     
def keypress(event):
    print(event.keysym)
    if event.keysym == 'Right':
        canv.move(rect,10,0)
    elif event.keysym == 'Left':
        canv.move(rect,-10,0)
    elif event.keysym == 'Up':
        canv.move(rect,0,-10)
    elif event.keysym == 'Down':
        canv.move(rect,0,10)
    else: return
    root.update_idletasks()
     
root.bind('<Key>',keypress) 
root.mainloop()

Офлайн

#3 Янв. 5, 2018 19:33:38

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

vic57
автоповтор идет
Нет. При управлении по SSH отключал в винде автоповтор символа. То же самое.

Офлайн

#4 Янв. 5, 2018 19:47:01

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

tkinter GPIO

отключи автоповтор и попробуй этот пример
и забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?

Офлайн

#5 Янв. 5, 2018 19:48:15

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

vic57
отключи автоповтор и попробуй этот примери забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?
Спасибо, сейчас попробую.
KeyRelease - чтобы светодиод горел, пока нажата клавиша

Отредактировано poruchik (Янв. 5, 2018 19:50:02)

Офлайн

#6 Янв. 5, 2018 19:57:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

tkinter GPIO

poruchik
Прошу помощи уважаемых гуро
за гуро отдельное спасибо http://lurkmore.to/%D0%93%D1%83%D1%80%D0%BE
для начала простенький пример:
 from tkinter import *
def keyup(e):
    print ('up', e.char)
def keydown(e):
    print ('down', e.char)
root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind("<KeyPress-a>", keydown)
frame.bind("<KeyRelease-a>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()
мы видим что при зажатии кнопки “a” сигнал KeyPress генерируеться постоянно, следовательно срабатывает ledON котороый делает GPIO.output(37,GPIO.HIGH)
поскольку у меня нету Raspberry pi то я не могу сказать что оно делает если на него еще раз подать GPIO.HIGH. Предполагаю что тушит, но это не точно..
Следвательно нум нужно чтобы при повторном нажатии без отпускания тригер не срабатывал. Модифицируем наш пример:
 from tkinter import *
btn_pressed = False
def keyup(e):
    global btn_pressed
    if btn_pressed:
        print ('up', e.char)
        btn_pressed = False
def keydown(e):
    global btn_pressed
    if not btn_pressed:
        print ('down', e.char)
        btn_pressed = True
root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind("<KeyPress-a>", keydown)
frame.bind("<KeyRelease-a>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()
Теперь при нажатии кнопки “а” сообщение о нажатии выводиться только один раз.
Возможно причина как раз в этом?




==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 5, 2018 20:01:30)

Офлайн

#7 Янв. 5, 2018 19:58:02

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

Совершенно та же самая картина. Автоповтор отключен, но программа упорно воспринимает нажатия клавы как множественные, хотя оно одно и непрерывное

Офлайн

#8 Янв. 5, 2018 19:59:45

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

PEHDOM
Теперь при нажатии кнопки “а” сообщение о нажатии выводиться только один раз.
Возможно причина как раз в этом?
Спасибо, это уже намного более схоже с моими предположениями))

Офлайн

#9 Янв. 5, 2018 20:11:20

poruchik
Зарегистрирован: 2018-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter GPIO

Прошу прощения, но нет. В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии

Офлайн

#10 Янв. 5, 2018 20:36:46

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

tkinter GPIO

poruchik
В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии
код в студию как вы это адаптировали, может не полностью скопировали\поняли суть, потому как повтора быть не должно.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 5, 2018 20:36:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version