Форум сайта python.su
Доброго времени суток!
Прошу прощения, если вопрос откровенно нубский.
На базе 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()
Офлайн
автоповтор идет
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()
Офлайн
vic57Нет. При управлении по SSH отключал в винде автоповтор символа. То же самое.
автоповтор идет
Офлайн
отключи автоповтор и попробуй этот пример
и забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?
Офлайн
vic57Спасибо, сейчас попробую.
отключи автоповтор и попробуй этот примери забинди как в примере - все клавиши на одну функцию. зачем тебе KeyRelease?
Отредактировано poruchik (Янв. 5, 2018 19:50:02)
Офлайн
poruchikза гуро отдельное спасибо
Прошу помощи уважаемых гуро
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()
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)
Офлайн
Совершенно та же самая картина. Автоповтор отключен, но программа упорно воспринимает нажатия клавы как множественные, хотя оно одно и непрерывное
Офлайн
PEHDOMСпасибо, это уже намного более схоже с моими предположениями))
Теперь при нажатии кнопки “а” сообщение о нажатии выводиться только один раз.
Возможно причина как раз в этом?
Офлайн
Прошу прощения, но нет. В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии
Офлайн
poruchikкод в студию как вы это адаптировали, может не полностью скопировали\поняли суть, потому как повтора быть не должно.
В приведенном примере, несмотря на отключенный автоповтор, происходит, увы, то же самое. Множественные сообщения о нажатии/отжатии
[code python][/code]
Отредактировано PEHDOM (Янв. 5, 2018 20:36:59)
Офлайн