GUI
Python3
Tkinter

Python3 + Tkinter のメモ

More than 1 year has passed since last update.


Python3 で GUI プログラミング

 選択肢の一つに Tkinter があるのでこれを使ってみるメモです。


参照


構造

tkinter は root を根とした木構造でGUIを構築する。

             root                

/ \
widget widget
/ \
widget widget

よって tkinter のプログラミングでは root を最初に作成し、その root から widget を作成して、その widget から別の widget を作成することで、木構造を構築していく。root の作成には Tk クラス、widget の作成には ttk 以下のクラスを使う。

    from tkinter import Tk, ttk

root = Tk()
btnframe = ttk.Frame(root)
btn = ttk.Button(btnframe, text='button')

btnframe.grid()
btn.grid()

root.mainloop()

Ttk Widget のリスト。

Frame

Label
Button
Checkbutton
Radiobutton
Entry
Combobox
Listbox
Scrollbar
SizeGrip
Text
Progressbar
Scale
Spinbox


動作

シェルから対話的に tkinter の動作が見られる。

$ python3

>>> from tkinter import Tk, ttk
>>> root = Tk()

ここでウィンドウが作成される。つまり、root はウィンドウを表す。

root から widget の Button を作成する。

>>> btn = ttk.Button(root, text='My button', command='buttonpressed')

>>> btn.grid()
>>> btn2 = ttk.Button(root, text='Hello', command='buttonpressed')
>>> btn2.grid()

ボタンが 2 つ root に grid される。

ボタンの値の変更方法は 2 通りある。

>>> btn['text'] = 'person button'

>>> btn.configure(text='null button')

でボタンの表示が変わる。ボタンの設定は

>>> btn.configure()

で見ることが出来る。


イベントのハンドリング

イベントのハンドリングはコールバックを使う。以下はラベルにマウス左クリック時のイベントをハンドリングしている。

from tkinter import Tk, ttk

root = Tk()

label = ttk.Label(root, text='Handling...')
label.grid()

label.bind('<1>', lambda ev: label.configure(text='Clicked left mouse button'))

root.mainloop()


フォント

フォントは tkinter.font.Font クラスで作成し、ラベルなどに合成する。

from tkinter import Tk, ttk, font

root = Tk()

font = font.Font(family='Helvetica', size=20, weight='bold')
label = ttk.Label(root, text='text', font=font)
label.grid()

root.mainloop()


画像

画像は tkinter.PhotoImage クラスで読み込んで widget に合成できる。

from tkinter import Tk, ttk, PhotoImage

root = Tk()

img = PhotoImage(file='img.png')

label = ttk.Label(root, image=img)
label.grid()

PIL と連携もできる。

from PIL import ImageTk, Image

myimg = ImageTk.PhotoImage(Image.open('myimage.png'))


ウィンドウのサイズ、移動

ウィンドウのサイズ、位置は geometry 関数で設定できる。

from tkinter import Tk

root = Tk()
print(root.geometry())
root.geometry('200x200+0+0')