Я пишу приложение tkinter на Python 3.12.0 (в Windows) и хочу связать другой «Enter» (который находится в части клавиатуры Num-Lock), чтобы при нажатии на него отправлялось мое сообщение. Я использую текстовый виджет, и мне нужен основной Enter для разрыва строки. Я решил свою проблему с помощью приведенного ниже кода, и он работает в моей системе; Но я ищу лучшее решение и не знаю, работает ли эта функция в других системах или даже в другой ОС.
def foo(event=None):
if not (event.keysym= = "Return" and event.state in [
262144, # Caps Lock Off, Num Lock Off, Scroll Lock Off
262146, # Caps Lock On , Num Lock Off, Scroll Lock Off
262152, # Caps Lock Off, Num Lock On , Scroll Lock Off
262154, # Caps Lock On , Num Lock On , Scroll Lock Off
262176, # Caps Lock Off, Num Lock Off, Scroll Lock On
262178, # Caps Lock On , Num Lock Off, Scroll Lock On
262184, # Caps Lock Off, Num Lock On , Scroll Lock On
262186, # Caps Lock On , Num Lock On , Scroll Lock On
]):
return
# do the code
Моя проблема уже решена. Я просто хочу знать, есть ли лучший способ связать другой «Enter»?
Редактировать: Как я уже сказал в первую очередь: я хочу использовать только вторую кнопку Enter и думаю, что не смогу донести свою точку зрения.
Вот мой код:
import tkinter as tk
def foo(event=None):
print(event)
print(event.state)
# to bind only to other Enter, but not the main Enter:
if event!=None and (not (event.keysym= = "Return" and event.state in [
262144, # Caps Lock Off, Num Lock Off, Scroll Lock Off
262146, # Caps Lock On , Num Lock Off, Scroll Lock Off
262152, # Caps Lock Off, Num Lock On , Scroll Lock Off
262154, # Caps Lock On , Num Lock On , Scroll Lock Off
262176, # Caps Lock Off, Num Lock Off, Scroll Lock On
262178, # Caps Lock On , Num Lock Off, Scroll Lock On
262184, # Caps Lock Off, Num Lock On , Scroll Lock On
262186, # Caps Lock On , Num Lock On , Scroll Lock On
])):
return
print("Yey!")
root = tk.Tk()
text = tk.Text(root, width=60, height=8)
text.bind('<Key>', foo)
text.pack()
tk.Button(root, text='Send', command=foo).pack()
root.mainloop()
Пожалуйста, проверьте ответы других.
Спасибо. Я пытался. но это не работает.
@Мохаммед, привет. Хотите сделать печать «Эй!» происходит только при нажатии клавиатуры entry? Я имею в виду, если вы, например, помимо клавиши entry нажмете клавиши shift или ctrl, «Эй!» не будет распечатано. Это то, чего вы хотите или вам бы хотелось «Да!» появляется всегда, несмотря на другие нажатые клавиши?
Я не уверен, почему KP_Enter не работает в Windows, и, к сожалению, все мои клавиатуры поддерживают TKL, поэтому я не могу легко проверить это за вас, но вы сможете быстро найти правильный символ клавиши для привязки, используя root.bind('<Key>', lambda e: print(e)). тест. Просто нажмите клавишу ввода на клавиатуре, и когда событие будет напечатано, вы сможете увидеть его имя.
@Danya K. Я хочу отправить свое сообщение, нажав только второй ввод. Включены или выключены клавиши блокировки. Но я хочу использовать основной Enter, чтобы разместить разрыв («\n») в моем тексте.
@JRiggles Я сделал это, и оба Enter печатают «Return», а также их тип — str. Единственное различие между ними — это государство. для более подробной информации ознакомьтесь с комментариями OldBoy и моими ответами. Спасибо, в любом случае.






См. Имена ключей tkinter для получения списка соответствующих привязок. Как видите, KP-Enter — это клавиша на клавиатуре, а Return — на основной клавиатуре.
Спасибо. Я прочитал ссылку, которую вы отправили. Но это пока не работает. Когда я использую print(event), результат следующий: <Событие KeyPress send_event=True state=Mod1|0x40000 keysym=Return keycode=13 char='\r' x=344 y=45>. Единственная разница между двумя вводами — это состояние, а символ клавиши по-прежнему «Return», а не KP_Enter.
Я погуглил KP_Enter, и дело в том, что я использую Windows, и он не работает в Windows. Спасибо, в любом случае. ссылка была хорошей. и я отредактировал вопрос и выделил Windows жирным шрифтом. Спасибо.🙏
@Mohammad 0x40000, добавленный к значению состояния, определяет, какая из двух клавиш была нажата. К сожалению, эта документация довольно старая, поэтому она не может быть на 100% точной.
знайте, что 0x40000 в шестнадцатеричном формате будет 262144 в десятичном, и я написал этот список по этой причине. Но я ищу простой метод, такой как KP_Enter, о котором все говорили и который не работает в моей системе.
Привязка к <KP_Enter> должна работать. Вот пример:
import tkinter as tk
def send_message(event):
print("message sent!")
return "break"
root = tk.Tk()
text = tk.Text(root)
text.pack(fill = "both", expand=True)
text.bind("<KP_Enter>", send_message)
tk.mainloop()
ОП уже проверил, что это не работает в Windows.
@ Брайан Окли Не работает, как я сказал. Спасибо, в любом случае. stackoverflow.com/questions/19142319/…
Попробуй это:
def foo(event=None):
if event and (not (event.keysym == "Return" and (event.state & 262144))):
return
print("Yey!")
Однако если вы нажмете клавиатуру Enter вместе с дополнительными клавишами, такими как shift, ctrl, alt или другими, печать все равно произойдет.
Если вы хотите, чтобы печать выполнялась только при нажатии клавиатуры Enter и не нажимаете никаких дополнительных клавиш (кроме различных замков), попробуйте этот код:
def foo(event=None):
if event and (not (event.keysym == "Return" and (event.state & 524245) == 262144)):
return
print("Yey!")
Совсем недавно я нашел третий вариант: попробуйте использовать привязку Extended-Return:
def foo(event=None):
print("Yey!")
root = tk.Tk()
text = tk.Text(root, width=60, height=8)
text.bind('<Extended-Return>', foo)
…
Должен дать тот же результат, что и первый пример.
Большое спасибо. Код объяснять не нужно. Я понял, что ты сделал. Вы использовали побитовое «и», чтобы определить, включена или выключена одна из замков. Очень интересный и мудрый метод. Первый меня устроил. Но второй больше, чем мне нужно, и он великолепен. Еще раз спасибо. Я жду других ответов, чтобы узнать, есть ли ключевое слово типа KP_Enter, которое будет работать в Windows в течение нескольких дней. Если не было, то отмечу ваш ответ как лучший.
@Мохаммад, можешь ли ты проверить третий вариант, который я только что добавил к ответу?
Попробуйте привязать событие
<KP_Enter>.