tkinter ‹KeyRelease› разное поведение в Windows и Linux

В моем классе CS мои ученики только что завершили свой первый конкурс «Клонировать ваш классический». Команда PONG быстро справилась с проблемой «Эй, моя ракетка зависла» с двумя игроками на одной версии клавиатуры. Я столкнулся с этой проблемой 5 лет назад и обнаружил: Привязка Python — позволяет одновременно нажимать несколько клавиш, что меня просветило (осторожно! В статье используется python2.7). Но тогда я не понимал, что скрипт работает только на Windows-машинах.

В системе Linux событие <KeyRelease-a> запускает обратный вызов, но event.char затем указывает на ' ', а не на 'a', как можно было бы ожидать. Я пытался погуглить, но даже на stackoverflow ничего интересного не нашел.

Любые подсказки? Затем найдите воспроизводимый пример кода:

import os
from tkinter import *

os.system("xset r off")

def keyup(e):
    #print(f"up {e.char}")
    print(f"up {e.keysym}")

def keydown(e):
    #print(f"down {e.char}")
    print(f"down {e.keysym}")

root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind("<KeyPress>", keydown)
frame.bind("<KeyRelease>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()

os.system("xset r on")

для воспроизводимости, как спросил Брайан, которого я благодарю за его беспокойство по поводу моего вопроса.


person smed    schedule 29.11.2020    source источник
comment
Пожалуйста, отредактируйте свой вопрос, включив в него минимально воспроизводимый пример. Это должно занять не более дюжины строк или около того.   -  person Bryan Oakley    schedule 29.11.2020
comment
Пожалуйста, не размещайте код в разделе комментариев. Если вы пытаетесь добавить дополнительную информацию, отредактируйте вопрос.   -  person Bryan Oakley    schedule 29.11.2020
comment
Вы пробовали e.keysym ? они используют keysym в официальном tcl документация.   -  person Atlas435    schedule 29.11.2020
comment
@ Atlas435 Большое спасибо, e.keysym справился со своей задачей.   -  person smed    schedule 16.12.2020


Ответы (1)


Просто чтобы закрыть тему, вся работа была сделана Atlas435: если вы хотите закодировать Pong с Tkinter, с двумя веслами, независимо слушающими нажатия клавиш, следуйте этому сообщению Python bind - разрешить одновременное нажатие нескольких клавиш, но изменить e.char на e.keysym в обратных вызовах на получить, какая клавиша вызвала событие Pressed или Released.

person smed    schedule 16.12.2020