LoginSignup
4
6

More than 3 years have passed since last update.

tkinterを使ってpython GUIを作る

Posted at

tkinterの使い方メモです

パネルを表示する

オブジェクト作ってmainloop()すると表示しながら待機状態に入ってくれます。

python
import tkinter as tk
root = tk.Tk()
root.mainloop()

パネルの大きさを設定

python
root = tk.Tk()
root.geometry("500x320")
root.mainloop()

パネルのタイトルを設定

python
root = tk.Tk()
root.geometry("250x150")
root.title('あびゃー')
root.mainloop()

パーツを置く

文字列ラベル

python
root = tk.Tk()
root.geometry("250x150")
label = tk.Label(text='らべる')
label.pack()
root.mainloop()


fontはfamily, size, style1, style2, ... という感じで指定します。

ボタン

以下はボタンを置くだけです。

python
root = tk.Tk()
root.geometry("250x150")
button = tk.Button(root, text="ぼたん", width=20, height=3)
button.pack()
root.mainloop()

ボタン操作に反応する

tkinterオブジェクトのbind()メソッドを実行すれば指定したeventが発生したときに関数を呼ぶように設定できます。bind()の第1引数がeventの種類、第2引数が呼ぶ関数です。以下では1回クリックされた時に発生するイベントでfunc()を呼ぶようにしています。

python
def func(event):
    print('ボタンを押したぞい')

root = tk.Tk()
root.geometry("250x150")
button = tk.Button(root, text="ぼたん", width=20, height=3)
button.bind('<Button-1>', func)
button.place(x=40, y=125)
root.mainloop()

image.png

ボタン操作に対応して表示を変更する

呼ばれる側の引数はtkinterが渡してくるeventしか受け取る事ができないので、関数内部で変数を扱う場合はグローバル変数にするか、class内に置いてclassプロパティを受け取るようにします。

python
class TkinterClass:
    def __init__(self):
        self.count = 0

        self.root = tk.Tk()
        self.root.geometry("250x160")

        label = tk.Label(text='押した回数をカウントします')
        label.pack(pady=10)

        self.button_text = tk.StringVar()
        self.button_text.set(self.count)
        button = tk.Button(self.root, textvariable=self.button_text, font=('', 32),
                           width=8, height=1, bg='#999999', activebackground="#aaaaaa")
        button.bind('<ButtonPress>', self.func1)
        button.pack(pady=10)
        self.root.mainloop()

    def func1(self, event):
        self.count += 1
        self.button_text.set(self.count)


if __name__ == '__main__':
    tkc = TkinterClass()

image.png

フォントを指定する

font family, font size, style1, style2,… の順で指定します。
styleが複数ある場合は3つめ以降に続けて書いていきます。

python
root = tk.Tk()
root.geometry("250x150")
label = tk.Label(text='らべる', font=('arial', 20, 'italic', 'overstrike'))
label.pack()
root.mainloop()


font familyは省略できます。

python
root = tk.Tk()
root.geometry("250x150")
label = tk.Label(text='らべる', font=('', 20))
label.pack()
root.mainloop()

パーツの配置

3つの配置方法があります

pack(): 順に置いていく
grid(): グリッドで並べていく
place(): 座標指定で置いていく

pack()

引数なしでpack()すると中央揃えで上から順に並べます。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.pack()

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.pack()

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.pack()

root.mainloop()

pack(anchor=tk.W)で左寄せ

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.pack(anchor=tk.W)

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.pack(anchor=tk.W)

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.pack(anchor=tk.W)

root.mainloop()

pack(fill=tk.X)で両揃え

fill=tk.Xで幅いっぱいに広げます。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X)

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X)

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X)

root.mainloop()

pack(padx=10, pady=10)でパディングする

pady, padxで縦横のすき間をpixelで指定できます。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X, padx=10, pady=10)

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X, padx=10, pady=10)

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.pack(fill=tk.X, padx=10, pady=10)

root.mainloop()

grid()

何も指定しないと左上から下に追加していきます。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.grid()

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.grid()

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.grid()

root.mainloop()

grid(row, column, columnspan)で位置と幅を指定

row, columnで位置を指定し、rowspan, columnspanで幅を指定します。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky=tk.W+tk.E)

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.grid(row=1, column=0, padx=10, pady=10)

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.grid(row=1, column=1, padx=10, pady=10)

root.mainloop()

place()

座標指定で配置します。

python
root = tk.Tk()
root.geometry("250x150")

label = tk.Label(text='らべる1', font=("", 12), bg='#33ccaa', relief=tk.RIDGE, bd=2)
label.place(x=10, y=10)

label = tk.Label(text='らべる2', font=("", 12), bg='#dd88aa', relief=tk.RIDGE, bd=2)
label.place(x=85, y=40)

label = tk.Label(text='らべる3', font=("", 12), bg='#bbdd44', relief=tk.RIDGE, bd=2)
label.place(x=25, y=90)

root.mainloop()

表示/非表示/終了

withdraw()で一時的に非表示に出来ます。

python
root.withdraw()

deiconify()で再表示できます。

python
root.deiconify()

destroy()すればtkinter窓を閉じてroot.loopmain()を抜けます。

python
root.destroy()
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6