Как добавить привязку ключа? - PullRequest
0 голосов
/ 23 мая 2018

Ни одно из других предложений стекового потока, ни какая-либо другая сторонняя документация не показали мне, как успешно связать ключ с функцией.Ниже приведены ссылки, которые я пробовал (код скопировал и вставил) и с которыми не повезло.Я вижу многих людей, предлагающих фокус в качестве причины сбоя, как будто кадр, содержащий кнопку, не является целью пользователя и, следовательно, не активен;однако из этого ничего не вышло.Ниже приведены ссылки, которые я пробовал:

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

https://softwareengineering.stackexchange.com/questions/213935/why-use-classes-when-programming-a-tkinter-gui-in-python

python tkinter как связать ключ с кнопкой

http://www.java2s.com/Code/Python/GUI-Tk/SetButtontogetfocus.htm

Как связать нажатие клавиши с кнопкой в ​​Tkinter

Я использую Python 3.6 в PyCharm 5.0.4.

Код в ссылках выше - это то, что я использовал / модифицировал, чтобы увидеть, как это работает, но ни одна попытка не закончилась выполнением действия.Самое большое, что я получил, - это сообщение об ошибке.

Спасибо.

РЕДАКТИРОВАТЬ: код, который я использую ниже (по самой последней ссылке)

from tkinter import *
root = Tk()

def LeftTurn(event):
    print('left')
frame=Frame(root, width=100, height=100)
frame.bind("<Left>", LeftTurn)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()


root.geometry("640x480")
root.title("Rover ")


root.mainloop()

Я также пыталсяэтот (ниже)

from tkinter import *

root = Tk()

def yourFunction(event):
    print('left')

frame = Frame(root, width=100, height=100)

frame.bind("<Left>",yourFunction)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()

root.mainloop()

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Так что ваш фрейм должен как-то сфокусироваться, чтобы ваша привязка работала.

Возьмите этот пример кода ниже.Если вы нажмете кнопку тестирования, фокус будет установлен на рамку, и вы можете нажать клавишу со стрелкой влево, и ваша функция будет выведена на консоль.Если вы затем щелкните внутри поля ввода, фокус будет перемещен в поле ввода, и ваше связывание больше не будет работать до тех пор, пока рамка снова не сфокусируется.

Так что это может быть полезно для некоторых вещей, но я никогда не делалнеобходимо связать с «рамкой», а точнее с корневыми или верхними окнами или определенным виджетом, который может взаимодействовать с клавиатурой или мышью напрямую, например, «Ввод» или «Текст».

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="test", command= frame.focus).pack()
Entry(frame).pack()

frame.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()

Возможно, вы хотите связать с root вместо этого для этого кода.Это всегда будет зависеть от того, на какой виджет в вашем корневом окне щелкнули или в каком кадре.

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="Button").pack()

root.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()
0 голосов
/ 23 мая 2018

Вы правы, это главный вопрос.Пользователь не может сфокусироваться на кадре, поэтому вы должны либо сделать это для них, добавив

frame.focus()

, либо вы можете привязать что-то, что не выходит из фокуса, например корневое окно:

root.bind("<Left>", LeftTurn) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...