Как привязать другой «Enter» на клавиатуре в python tkinter?

Я пишу приложение 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()

Пожалуйста, проверьте ответы других.

Попробуйте привязать событие <KP_Enter>.

acw1668 11.03.2024 10:40

Спасибо. Я пытался. но это не работает.

Mohammad 11.03.2024 11:14

@Мохаммед, привет. Хотите сделать печать «Эй!» происходит только при нажатии клавиатуры entry? Я имею в виду, если вы, например, помимо клавиши entry нажмете клавиши shift или ctrl, «Эй!» не будет распечатано. Это то, чего вы хотите или вам бы хотелось «Да!» появляется всегда, несмотря на другие нажатые клавиши?

Danya K 11.03.2024 17:24

Я не уверен, почему KP_Enter не работает в Windows, и, к сожалению, все мои клавиатуры поддерживают TKL, поэтому я не могу легко проверить это за вас, но вы сможете быстро найти правильный символ клавиши для привязки, используя root.bind('<Key>', lambda e: print(e)). тест. Просто нажмите клавишу ввода на клавиатуре, и когда событие будет напечатано, вы сможете увидеть его имя.

JRiggles 11.03.2024 20:11

@Danya K. Я хочу отправить свое сообщение, нажав только второй ввод. Включены или выключены клавиши блокировки. Но я хочу использовать основной Enter, чтобы разместить разрыв («\n») в моем тексте.

Mohammad 11.03.2024 20:25

@JRiggles Я сделал это, и оба Enter печатают «Return», а также их тип — str. Единственное различие между ними — это государство. для более подробной информации ознакомьтесь с комментариями OldBoy и моими ответами. Спасибо, в любом случае.

Mohammad 11.03.2024 20:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
141
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

См. Имена ключей 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.

Mohammad 11.03.2024 11:28

Я погуглил KP_Enter, и дело в том, что я использую Windows, и он не работает в Windows. Спасибо, в любом случае. ссылка была хорошей. и я отредактировал вопрос и выделил Windows жирным шрифтом. Спасибо.🙏

Mohammad 11.03.2024 11:33

@Mohammad 0x40000, добавленный к значению состояния, определяет, какая из двух клавиш была нажата. К сожалению, эта документация довольно старая, поэтому она не может быть на 100% точной.

OldBoy 11.03.2024 12:55

знайте, что 0x40000 в шестнадцатеричном формате будет 262144 в десятичном, и я написал этот список по этой причине. Но я ищу простой метод, такой как KP_Enter, о котором все говорили и который не работает в моей системе.

Mohammad 11.03.2024 15:46

Привязка к <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.

acw1668 11.03.2024 14:54

@ Брайан Окли Не работает, как я сказал. Спасибо, в любом случае. stackoverflow.com/questions/19142319/…

Mohammad 11.03.2024 16:05
Ответ принят как подходящий

Попробуй это:

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 в течение нескольких дней. Если не было, то отмечу ваш ответ как лучший.

Mohammad 12.03.2024 13:54

@Мохаммад, можешь ли ты проверить третий вариант, который я только что добавил к ответу?

Danya K 12.03.2024 14:45

Другие вопросы по теме