プラットフォームの提供する 「On-Screen キーボード」が使えるなら
そちらを使った方が良いと思います。(呼び出し方は、プラットフォーム毎に異なります)
(確認点)Enter キーが特殊な形状でなくても良いなら
レイアプトの実装案は、grid の columnspan を指定することで、
複数列に跨るグリッドを表現できます。
キーの columnspan:2 として、TAB:3, CAPS:4, SHIFT:5
python
1import tkinter as tk
2from tkinter import ttk
3
4KEYBOARD_LAYOUT = [
5 # ["ESC", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
6 ["Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
7 ["Caps", "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "Enter"],
8 ["Shift", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]
9]
10KEYBOARD_GRIDSPAN = [
11 # [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], # ESC
12 [3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], # Tab
13 [4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], # Caps
14 [5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], # Shift
15]
16
17def iter_colspan(grid, column=0):
18 """
19 column, columnspan を返すジェネレーター
20
21 grid に指定する column は span のサイズだけ進める事になるので
22
23 Tab (column=0, span=3)
24 Q (column=3, span=2) # columnは直前の column+span
25 W (column=5, span=2)
26
27 [(0,3), (3,2), (5,2), ...] といった数列を返します
28
29 """
30 for colspan in grid:
31 yield column, colspan
32 column += colspan
33
34
35root = tk.Tk()
36
37for row, (grid, data) in enumerate(zip(KEYBOARD_GRIDSPAN, KEYBOARD_LAYOUT)):
38 for (col, span), text in zip(iter_colspan(grid), data):
39 # print(row, col, span, text)
40 label = ttk.Button(root, text=text)
41 label.grid(row=row, column=col, columnspan=span,
42 padx=2, pady=2, sticky=tk.NSEW
43 )
44
45root.grid_rowconfigure(list(range(5)), weight=1)
46root.grid_columnconfigure(list(range(30)), weight=1)
47root.geometry("800x200")
48root.mainloop()
リサイズ対応でレイアウトを保つのは難しいかもしれません。
リサイズ時のイベントで columnconfigure の minsize 調整等。
※ KEYBOARD_LAYOUT, KEYBOARD_GRIDSPAN の最初の行のコメントを外すと確認できますが、
セル幅を伸縮可能にすると、columnspan の幅は等分割ではないので、
spanでの「ずれ」が誤差範囲になってしまいます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。