リスト : Ttk Widget の簡単な使用例 import tkinter as tk import tkinter.ttk as ttk import sys root = tk.Tk() style = ttk.Style() # print(style.theme_names()) if len(sys.argv) >= 2: theme = sys.argv[1] style.theme_use(theme) else: theme = style.theme_use() style.configure('.', font = ('', 12)) # Ttk Widget のフォントの大きさを 12 に変更 # ラジオボタン用 v = tk.IntVar() v.set(0) # チェックボタン用 opts = [tk.BooleanVar() for _ in range(4)] for x in range(4): opts[x].set(True) # テーマ表示用ラベル la = ttk.Label(text = theme) la.pack() # ボタン類の配置 f0 = ttk.LabelFrame(root, text = 'Buttons') f1 = ttk.LabelFrame(root, text = 'CheckButtons') f2 = ttk.LabelFrame(root, text = 'RadioButtons') for x in range(4): ttk.Button(f0, text = 'button {}'.format(x)).pack() ttk.Radiobutton(f1, text = 'radiobutton {}'.format(x), value = x, variable = v).pack() ttk.Checkbutton(f2, text = 'checkbutton {}'.format(x), variable = opts[x]).pack() f0.pack(padx = 5, pady = 5, side = tk.LEFT) f1.pack(padx = 5, pady = 5, side = tk.LEFT) f2.pack(padx = 5, pady = 5, side = tk.LEFT) root.mainloop()
リスト : Ttk Widget の簡単な使用例 import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() style = ttk.Style() style.theme_use('winnative') style.configure('test1.TLabel', font = ('Ricty Diminished', 12)) style.configure('test2.TLabel', font = ('Ricty Diminished', 14), foreground = 'blue') style.configure('test3.TLabel', font = ('Ricty Diminished', 16, 'italic'), foreground = 'green') str = 'Hello, world, こんにちは世界' ttk.Label(root, text = str, style = 'test1.TLabel').pack() ttk.Label(root, text = str, style = 'test2.TLabel').pack() ttk.Label(root, text = str, style = 'test3.TLabel').pack() root.mainloop()
Combobox(widget, option = value, ...)
height | リストボックスの行数 |
width | エントリーの文字数 |
state | 'normal' : エントリーとリストボックスの両方から入力できる 'readonly' : リストボックスのみ有効 'disabled' : どちらも無効 |
values | リストボックスに表示するデータを格納したタプル (またはリスト) |
リスト : コンボボックスの使用例 import tkinter as tk import tkinter.ttk as ttk import datetime root = tk.Tk() style = ttk.Style() style.configure('.', font = ('', 14)) label_buff = tk.StringVar() label_buff.set('') year_buff = tk.StringVar() year_buff.set('1970') month_buff = tk.StringVar() month_buff.set('1') day_buff = tk.StringVar() day_buff.set('1') la = ttk.Label(root, textvariable = label_buff) la.pack() ttk.Label(root, text = " 年: ").pack(side = tk.LEFT) year_cb = ttk.Combobox(root, textvariable = year_buff, width = 8, value = tuple(range(1970, 2031))) year_cb.pack(side = tk.LEFT) ttk.Label(root, text = " 月: ").pack(side = tk.LEFT) month_cb = ttk.Combobox(root, textvariable = month_buff, width = 8, height = 12, value = tuple(range(1, 13))) month_cb.pack(side = tk.LEFT) ttk.Label(root, text = " 日: ").pack(side = tk.LEFT) day_cb = ttk.Combobox(root, textvariable = day_buff, width = 8, value = tuple(range(1, 32))) day_cb.pack(side = tk.LEFT) # 日付の確認 def check_date(y, m, d): try: datetime.date(int(y), int(m), int(d)) return True except Exception: return False # 入力データの表示 def get_item(event): if check_date(year_cb.get(), month_cb.get(), day_cb.get()): label_buff.set('{} 年 {} 月 {} 日'.format(year_cb.get(), month_cb.get(), day_cb.get())) else: label_buff.set('Input Error') year_cb.bind('<<ComboboxSelected>>', get_item) year_cb.bind('<Return>', get_item) month_cb.bind('<<ComboboxSelected>>', get_item) month_cb.bind('<Return>', get_item) day_cb.bind('<<ComboboxSelected>>', get_item) day_cb.bind('<Return>', get_item) get_item(None) root.mainloop()
初期状態
日付の入力
エラー
リスト : ノートブックの使用例 (1) import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() style = ttk.Style() style.configure("TButton", font = ('', 16)) style.configure("TRadiobutton", font = ('', 16)) style.configure("TCheckbutton", font = ('', 16)) v = tk.IntVar() v.set(0) opts = [tk.BooleanVar() for _ in range(4)] for x in range(4): opts[x].set(True) # ノートブック nb = ttk.Notebook(root) nb.pack() # ボタン類の配置 f0 = ttk.Frame(root) f1 = ttk.Frame(root) f2 = ttk.Frame(root) for x in range(4): ttk.Button(f0, text = 'button {}'.format(x)).pack() ttk.Radiobutton(f1, text = 'radiobutton {}'.format(x), value = x, variable = v).pack() ttk.Checkbutton(f2, text = 'checkbutton {}'.format(x), variable = opts[x]).pack() nb.add(f0, text = 'Button', padding = 20) nb.add(f1, text = 'Radio', padding = 20) nb.add(f2, text = 'Check', padding = 20) root.mainloop()
初期状態 (Button が選択されている)
Radio を選択
Check を選択
リスト : ノートブックの使用例 (2) import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() root.option_add('*Text.font', ('', 14)) #style = ttk.Style() #style.configure(".", font = ('', 12)) # 生成したテキストウィジェットの個数 text_count = 0 # ノートブック nb = ttk.Notebook(root) # テキストウィジェットを追加 def new_text(): global text_count tw = tk.Text(width = 40, height = 10) text_count += 1 nb.add(tw, text = 'Memo{}'.format(text_count)) nb.select(tw) # テキストウィジェットを削除 def del_text(): nb.forget('current') # ボタン fr = ttk.Frame() ttk.Button(fr, text = 'New', command = new_text).pack(side = tk.LEFT) ttk.Button(fr, text = 'Del', command = del_text).pack(side = tk.LEFT) # 配置 fr.pack(anchor = tk.W) nb.pack() root.mainloop()
初期状態
Memo1 を生成
Memo2 を生成
Memo3 を生成して Memo2 を削除
リスト : プログレスバーの使用例 import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() var = tk.IntVar() var.set(0) pb1_id = None def exec_pb1(): global pb1_id var.set(var.get() + 1) if var.get() < 100: pb1_id = root.after(40, exec_pb1) def start_pb1(): var.set(0) exec_pb1() def stop_pb1(): global pb1_id if pb1_id is not None: root.after_cancel(pb1_id) pb1_id = None pb1 = ttk.Progressbar(root, length = 200, variable = var) pb2 = ttk.Progressbar(root, length = 200, mode = 'indeterminate') pb1.pack() f1 = ttk.Frame() ttk.Button(f1, text = 'Start', command = start_pb1).pack(side = tk.LEFT) ttk.Button(f1, text = 'Stop', command = stop_pb1).pack(side = tk.LEFT) f1.pack() pb2.pack() f2 = ttk.Frame() ttk.Button(f2, text = 'Start', command = lambda : pb2.start(10)).pack(side = tk.LEFT) ttk.Button(f2, text = 'Stop', command = lambda : pb2.stop()).pack(side = tk.LEFT) f2.pack() root.mainloop()
初期状態
途中経過
pb1 が終了し、pb2 を停止した状態
リスト : ツリービューの簡単な使用例 (1) import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() style = ttk.Style() style.configure('.', font = ('', 12)) tview = ttk.Treeview(root, columns = ('Name', 'Height')) tview.column('#0', width = 50) tview.column('Name', anchor = 'w', width = 100) tview.column('Height', anchor = 'e', width = 50) tview.heading('#0', text = "クラス") tview.heading('Name', text = "名前") tview.heading('Height', text = "身長") id = tview.insert('', 'end', text = 'A') tview.insert(id, 'end', values = ('Ada', 148.7)) tview.insert(id, 'end', values = ('Hanna', 154.2)) tview.insert(id, 'end', values = ('Miranda', 148.2)) id = tview.insert('', 'end', text = 'B') tview.insert(id, 'end', values = ('Alice', 149.5)) tview.insert(id, 'end', values = ('Janet', 147.8)) tview.insert(id, 'end', values = ('Sara', 153.1)) id = tview.insert('', 'end', text = 'C') tview.insert(id, 'end', values = ('Carey', 133.7)) tview.insert(id, 'end', values = ('Linda', 154.6)) tview.insert(id, 'end', values = ('Tracy', 138.2)) id = tview.insert('', 'end', text = 'D') tview.insert(id, 'end', values = ('Ellen', 157.9)) tview.insert(id, 'end', values = ('Maria', 159.1)) tview.insert(id, 'end', values = ('Violet', 138.7)) sb = ttk.Scrollbar(root, orient = 'v', command = tview.yview) tview.configure(yscrollcommand = sb.set) tview.pack(side = tk.LEFT) sb.pack(side = tk.LEFT, fill = tk.Y) root.mainloop()
初期状態
クラス A を表示
クラス A と C を表示
全クラスを表示
set(item, column = None, value = None)
リスト : 身長の更新機能を追加 import tkinter as tk import tkinter.ttk as ttk root = tk.Tk() style = ttk.Style() style.configure('.', font = ('', 12)) # グローバル変数 buff1 = tk.StringVar() buff1.set('') buff2 = tk.StringVar() buff2.set('') select_item = None fr = ttk.Frame() ttk.Label(fr, textvariable = buff1).pack(side = tk.LEFT) e = ttk.Entry(fr, width = 8, textvariable = buff2) e.pack(side = tk.LEFT) fr.pack() tview = ttk.Treeview(root, columns = ('Name', 'Height')) tview.column('#0', width = 50) tview.column('Name', anchor = 'w', width = 100) tview.column('Height', anchor = 'e', width = 50) tview.heading('#0', text = "クラス") tview.heading('Name', text = "名前") tview.heading('Height', text = "身長") id = tview.insert('', 'end', text = 'A') tview.insert(id, 'end', values = ('Ada', 148.7)) tview.insert(id, 'end', values = ('Hanna', 154.2)) tview.insert(id, 'end', values = ('Miranda', 148.2)) id = tview.insert('', 'end', text = 'B') tview.insert(id, 'end', values = ('Alice', 149.5)) tview.insert(id, 'end', values = ('Janet', 147.8)) tview.insert(id, 'end', values = ('Sara', 153.1)) id = tview.insert('', 'end', text = 'C') tview.insert(id, 'end', values = ('Carey', 133.7)) tview.insert(id, 'end', values = ('Linda', 154.6)) tview.insert(id, 'end', values = ('Tracy', 138.2)) id = tview.insert('', 'end', text = 'D') tview.insert(id, 'end', values = ('Ellen', 157.9)) tview.insert(id, 'end', values = ('Maria', 159.1)) tview.insert(id, 'end', values = ('Violet', 138.7)) sb = ttk.Scrollbar(root, orient = 'v', command = tview.yview) tview.configure(yscrollcommand = sb.set) tview.pack(side = tk.LEFT) sb.pack(side = tk.LEFT, fill = tk.Y) # 生徒の選択 def select_student(event): global select_item x = tview.selection()[0] d = tview.set(x) if d: buff1.set(d['Name']) buff2.set(d['Height']) select_item = x else: buff1.set('') buff2.set('') select_item = None # 身長の更新 def update_height(event): if select_item: tview.set(select_item, 'Height', buff2.get()) # バインディング e.bind('<Return>', update_height) tview.bind('<<TreeviewSelect>>', select_student) root.mainloop()
Alice を選択
エントリーで身長を入力
リターンキーで更新