質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

2回答

3319閲覧

Python3 Tkinter キーボードを作る

person

総合スコア223

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2021/06/05 01:58

Tkinterでボタンを配置してキーボードを作りたいです。

全部ではないですが、下のようにキーボードを作っていくと、
マス目のようにボタンが配置されます。

それでもいいのですが、実際のキーボードは
配置がずれています。
(Tab、capslockなどのキーの長さが異なるため)

この配置を表現することは可能ですか?
(widthを指定したりplace()を使うなどあると思いますが、ウィンドウの大きさを変える前提で考えているので、この方法だと表示が崩れると思いました。)

Python

1import tkinter as tk 2 3win = tk.Tk() 4 5win.rowconfigure((0,1), weight=1) 6win.columnconfigure((0,1), weight=1) 7 8button_1 = tk.Button(win, text="1") 9button_1.grid(row=0, column=0, sticky="nsew") 10 11button_2 = tk.Button(win, text="2") 12button_2.grid(row=0, column=1, sticky="nsew") 13 14button_q = tk.Button(win, text="Q") 15button_q.grid(row=1, column=0, sticky="nsew") 16 17button_w = tk.Button(win, text="Q") 18button_w.grid(row=1, column=1, sticky="nsew") 19 20win.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

columnspanでキー1つに2マス使えば行けるんではないだろうか。

button_1 = tk.Button(win, text="1") button_1.grid(row=0, column=0,columnspan=2, sticky="nsew") button_2 = tk.Button(win, text="2") button_2.grid(row=0, column=2,columnspan=2, sticky="nsew") button_q = tk.Button(win, text="Q") button_q.grid(row=1, column=1,columnspan=2, sticky="nsew")

投稿2021/06/05 04:50

Poohtaro

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

プラットフォームの提供する 「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での「ずれ」が誤差範囲になってしまいます。

投稿2021/06/05 04:44

編集2021/06/05 04:54
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問