Найти - Пользователи
Полная версия: tkinter GPIO
Начало » Python для новичков » tkinter GPIO
1 2
poruchik
Доброго времени суток!
Прошу прощения, если вопрос откровенно нубский.
На базе 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()
Если привязывать событие к виртуальной кнопке, то все нормально. Если же к клавиатуре, то лампочка моргает в режиме генератора, и видно, что для программы кнопка постоянно то нажимается, то отжимается, хотя она непрерывно нажата. С чем это связано, и как с этим бороться?
Прошу помощи уважаемых гуро
vic57
автоповтор идет
 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()
poruchik
vic57
автоповтор идет
Нет. При управлении по SSH отключал в винде автоповтор символа. То же самое.
vic57
отключи автоповтор и попробуй этот пример
и забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?
poruchik
vic57
отключи автоповтор и попробуй этот примери забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?
Спасибо, сейчас попробую.
KeyRelease - чтобы светодиод горел, пока нажата клавиша
PEHDOM
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()
Теперь при нажатии кнопки “а” сообщение о нажатии выводиться только один раз.
Возможно причина как раз в этом?


poruchik
Совершенно та же самая картина. Автоповтор отключен, но программа упорно воспринимает нажатия клавы как множественные, хотя оно одно и непрерывное
poruchik
PEHDOM
Теперь при нажатии кнопки “а” сообщение о нажатии выводиться только один раз.
Возможно причина как раз в этом?
Спасибо, это уже намного более схоже с моими предположениями))
poruchik
Прошу прощения, но нет. В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии
PEHDOM
poruchik
В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии
код в студию как вы это адаптировали, может не полностью скопировали\поняли суть, потому как повтора быть не должно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB