-
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathtkinter_pressed_keys.py
More file actions
105 lines (92 loc) · 2.76 KB
/
tkinter_pressed_keys.py
File metadata and controls
105 lines (92 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import argparse
import tkinter as tk
import tkinter.font as tkf
import keyboardlayout as kl
import keyboardlayout.tkinter as klt
grey = '#bebebe'
dark_grey = '#414141'
key_size = 60
def get_keyboard(
window: tk.Tk,
layout_name: kl.LayoutName,
key_info: kl.KeyInfo
) -> klt.KeyboardLayout:
keyboard_info = kl.KeyboardInfo(
position=(0, 0),
padding=2,
color=dark_grey
)
letter_key_size = (key_size, key_size) # width, height
keyboard_layout = klt.KeyboardLayout(
layout_name,
keyboard_info,
letter_key_size,
key_info,
master=window
)
return keyboard_layout
def run_until_user_closes_window(
window: tk.Tk,
keyboard: klt.KeyboardLayout,
released_key_info: kl.KeyInfo,
):
pressed_key_info = kl.KeyInfo(
margin=14,
color='red',
txt_color='white',
txt_font=tkf.Font(family='Arial', size=key_size//4),
txt_padding=(key_size//6, key_size//10)
)
"""
in the azerty layout store the pressed state of the key ˆ (upper case ¨)
because tkinter does not register a key up event for that key
That key adds accents to the key pressed after this key
"""
dead_key_pressed = False
dead_key_keys = {kl.Key.CIRCUMFLEX, kl.Key.DIACRATICAL}
def keyup(e):
key = keyboard.get_key(e)
if key is None:
return
keyboard.update_key(
key, released_key_info)
nonlocal dead_key_pressed
if dead_key_pressed and key not in dead_key_keys:
dead_key_pressed = False
keyboard.update_key(
kl.Key.CIRCUMFLEX, released_key_info)
def keydown(e):
key = keyboard.get_key(e)
if key is None:
return
keyboard.update_key(key, pressed_key_info)
if key in dead_key_keys:
nonlocal dead_key_pressed
dead_key_pressed = True
keyboard.bind("<KeyPress>", keydown)
keyboard.bind("<KeyRelease>", keyup)
keyboard.focus_set()
window.mainloop()
def keyboard_example(layout_name: kl.LayoutName):
window = tk.Tk()
window.resizable(False, False)
key_info = kl.KeyInfo(
margin=10,
color=grey,
txt_color=dark_grey,
txt_font=tkf.Font(family='Arial', size=key_size//4),
txt_padding=(key_size//6, key_size//10)
)
keyboard = get_keyboard(window, layout_name, key_info)
run_until_user_closes_window(window, keyboard, key_info)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
'layout_name',
nargs='?',
type=kl.LayoutName,
default=kl.LayoutName.QWERTY,
help='the layout_name to use'
)
args = parser.parse_args()
keyboard_example(args.layout_name)