いろいろなウィジェット

提供: tknotebook
移動: 案内検索

メインページ>コンピュータの部屋#Python>Tkinter Tips


Tkinter とはいわゆる Tcl/Tk の Python インターフェースですが、Tcl/Tk がサポートするウィジェット(GUIの部品)はそれほど多くありません。

とりあえず15個ほど紹介しておきます。そのほかに、単なる部品のコンテナである Frame や、メニュー関係のボタン、トップレベルウィンドウなども あるのですが、それは別の記事で紹介します。

15種のウィジェットを表示するコード

Tkinter は使いやすいので、比較的簡単に全種類のウィジェットをウィンドウに貼り付けられます。 こんなコードです。

import tkinter as tk
import tkinter.messagebox as tmb

root = tk.Tk()

# Labelframe and Label 1, 2
tk.Label(root, text="1, 2: Labelframe \nand Label").grid(row=0, sticky="e")
labelframe = tk.LabelFrame(root, text="LabelFrame")
labelframe.grid(row=0, column=1, padx=10, pady=10)
tk.Label(labelframe, text="Label").pack() 

# Button 3
tk.Label(root, text="3: Button").grid(row=1, sticky="e")
tk.Button(root, text="Button", command=lambda : tmb.showinfo("メッセージ", "clicked")).\
    grid(row=1, column=1, padx=10, pady=10)

# Entry 4
tk.Label(root, text="4: Entry").grid(row=2, sticky="e")
tk.Entry(root).grid(row=2, column=1, padx=10, pady=10)

# Checkbutton 5
tk.Label(root, text="5: CheckButton").grid(row=3, sticky="e")
tk.Checkbutton(root, text="A").grid(row=3, column=1, padx=10, pady=10)

# radioButton 6
tk.Label(root, text="6: RadioButton").grid(row=4, sticky="e")
frame_for_radio = tk.Frame(root)
frame_for_radio.grid(row=4, column=1, padx=10, pady=10)
iv1 = tk.IntVar()
iv1.set(1)
tk.Radiobutton(frame_for_radio, text="a", value=1, variable=iv1).pack()
tk.Radiobutton(frame_for_radio, text="b", value=2, variable=iv1).pack()
tk.Radiobutton(frame_for_radio, text="c", value=3, variable=iv1).pack()

# OptionMenu 7
tk.Label(root, text="7: OptionMenu").grid(row=5, sticky="e")
sv1 = tk.StringVar()
sv1.set('オプション1')
tk.OptionMenu(root, sv1, 'オプション1', 'オプション2').grid(row=5, column=1, padx=10, pady=10) 

# Listbox 8
tk.Label(root, text="8: Listbox").grid(row=6, sticky="e")
listbox = tk.Listbox(root, height=4)
for line in ["選択肢1", "選択肢2","選択肢3","選択肢4", "選択肢5"]:
    listbox.insert(tk.END, line)
listbox.select_set(1)
listbox.grid(row=6, column=1, padx=10, pady=10)

# Spinbox 9
tk.Label(root, text="9: Spinbox").grid(row=0, column=2, sticky="e")
tk.Spinbox(root, values=(2, 4, 10)).grid(row=0, column=3, padx=10, pady=10)

# Scale 10
tk.Label(root, text="10: Scale").grid(row=1, column=2, sticky="e")
tk.Scale(root, from_=10, to=80, label='Scale', orient=tk.HORIZONTAL).grid(row=1, column=3, padx=10, pady=10) 

# Message 11
tk.Label(root, text="11: Message").grid(row=2, column=2, sticky="e")
tk.Message(root, text="私の名前は中村です").grid(row=2, column=3, padx=10, pady=10)

# Text 12
tk.Label(root, text="12: Text").grid(row=3, column=2, sticky="e")
text = tk.Text(root, width=20, height=6)
text.insert(tk.END, "sample text\n1\n2\n3")
text.grid(row=3, column=3, padx=10, pady=10)

# ScrollBar with Listbox 13
tk.Label(root, text="13: Listbox \n& ScrollBar").grid(row=4, column=2, sticky="e")
scrollbar_frame = tk.Frame(root)
scrollbar_frame.grid(row=4, column=3, padx=10, pady=10)
listbox2 = tk.Listbox(scrollbar_frame)
for i in range(1000):
    listbox2.insert(tk.END, i)
listbox2.pack(side=tk.LEFT)
scroll_bar =tk.Scrollbar(scrollbar_frame, command=listbox2.yview)
scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
listbox2.config(yscrollcommand=scroll_bar.set)

# Canvas 14
tk.Label(root, text="14: Canvas").grid(row=5, column=2, sticky="e")
canvas = tk.Canvas(root, bg='white', width=200, height=100)
canvas.grid(row=5, column=3, padx=10, pady=10)
canvas.create_oval(25, 15, 180, 60, fill='red')
canvas.create_oval(25, 45, 180, 85, fill='blue')
canvas.create_text(100, 90, text='Canvasウィジェット', fill="green")

# PanedWindow 15
tk.Label(root, text="15: PanedFrame").grid(row=6, column=2, sticky="e")
panedwindow_frame = tk.Frame(root)
panedwindow_frame.grid(row=6, column=3, padx=10, pady=10)
panedwindow1 = tk.PanedWindow(panedwindow_frame)
text1 = tk.Text(panedwindow1, height=6, width=15)
text1.insert(tk.END, "中村拓男")
panedwindow1.add(text1)
panedwindow1.pack(fill=tk.BOTH, expand=2)
panedwindow2 = tk.PanedWindow(panedwindow1)
text2 = tk.Text(panedwindow1, height=6, width=15)
text2.insert(tk.END, "中村香織")
panedwindow2.add(text2)
panedwindow1.add(panedwindow2)


root.title("いろいろなウィジェット")
root.mainloop()

ウィジェットの表示

表示はこんな感じになります。

Tkinter いろいろなウィジェット.png

簡単な解説

簡単に解説しておくと、

1. LabelFrame
いわゆるグループボックスです。コンテナに枠線とラベルが付きます。
2. Label
画面に文字を表示するウィジェットです。
3. Button
ボタンですね。
4. Entry
1行の文字列を入力するためのウィジェットです。テキストボックスですね。
5. CheckButton
所謂チェックボックスです。
6. RadioButton
所謂ラジオボタンです。
7. OptionMemu
普通はドロップダウンリストとかコンボとか呼ばれているものですね。
8. ListBox
ごく普通のリストボックスです。
9. Spinbox
Entryに類似していてテキストを入力できますが、あらかじめセットされている値を矢印ボタンで選ぶことができるウィジェットです。
10. Scale
所謂スライドバーですね。数値をアナログ的に入力するのに使います。
11. Message
機能的には Label と同じですが、複数行の文字を表示するためのウィジェットです。
12. Text
機能的には Entry に似ていますが、複数行の文字を編集/入力するためのウィジェットです。
13. Scrollbar
いわゆるスクロールバーですが、単独では使用できず、Listbox などと互いにイベントをやり取りして動く点が、普通のGUIツールのスクロールバーとは異なります。
14. Canvas
任意の図形が描けるウィジェットです。一種のお絵かきツールです。描いた図形はウィジェットに保持され消えません。
15.PanedWindow
これは Frame等と同様コンテナで、他のウィジェットを乗せることができるウィジェットです。複数のPanedWindowを縦や横に積むとその境界線をマウスでドラッグできます。利用者がウィジェットのレイアウトをマウスで若干変更できるようにするためのウィジェットです。


いやー、少ないですよね。グリッド系とか全然ないし、データベースクライアントとかは作るのに苦労しそうです。タブとかもないですよね。

でも最近では tkinterモジュールとは別に ttkというモジュールにもウィジェットが入っており、 より美しく、機能も洗練されたウィジェットが追加されています。最初から、ttk を使うように勧める本も 現れています。

ttkモジュールに関しては、別途紹介します。