PythonのtkinterでGUI入門

PythonのtkinterでGUI入門

PythonではGUIプログラムも作成することができてしまいます。

バージョン
v3.6.2

tkinterをimportすれば簡単に作成できます。

C:\>python sample001.py

sample001.py

import tkinter
root = tkinter.Tk()
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

右上の✖印で閉じます。

ウィンドウのタイトルが「tk」になっているので変更します。デフォルトウィンドウサイズも変更してみます。

C:\>python sample001.py

sample001.py

import tkinter
root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

ウィンドウのタイトルとデフォルトウィンドウサイズが変わっていることが確認できます。

geometry関数を使ってサイズを指定することもできます。
引数は文字列ですが、”縦x横”です。xはエックスです。
import tkinter
root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

テキストラベルをウィンドウに表示する

ウィンドウにラベルを表示してみます。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
text = tkinter.Label(text="年齢を入力してください")
text.place(x=0, y=0)
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

変数textをx座標=0,y座標=0の場所に表示しています。

テキストボックスを表示する

tkinter.Entryを使ってテキストボックスを表示します。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
text = tkinter.Entry(width=8)
text.place(x=10, y=10)
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

tkinter.Entry(width=8, bd=4)というようにbd=4とするとテキストボックスのボーダーが立体的になります。

PythonでGUI入門

テキストボックスにデフォルト値を入力しておく

テキストボックスは普通に表示すれば空ですが、デフォルト値を設定することもできます。

insert()関数を使用します。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

text = tkinter.Entry(width=12)
text.insert(tkinter.END,"デフォルト") # 第一引数はtkinter.END
text.place(x=10, y=50)

root.mainloop()

実行するとテキストボックスにデフォルト値が入っています。

PythonでGUI入門

テキストボックスの入力値をクリアする

delete()関数を使用してテキストボックスの入力値をクリアすることができます。

クリアするにはボタン押下して、そのイベントで削除します。ボタンについては後述します。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

text = tkinter.Entry(width=12)
text.insert(tkinter.END,"デフォルト")
text.place(x=10, y=50)

def event():
text.delete(0, tkinter.END)

btn = tkinter.Button(text="ボタン")
btn.place(x=10, y=10)
btn["command"] = event
root.mainloop()

実行して、ボタンを押すと、テキスト欄が全クリアされます。

0~tkinter.END(最後)まで削除するという意味です。

text.delete(0, 1)というように記述すると1文字ずつ削除されていきます。

PythonでGUI入門

ボタンを表示する

tkinter.Buttonでボタンを表示することができます。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
btn = tkinter.Button(text="ボタン")
btn.place(x=10, y=10)
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

ボタンのボーダーを変更することもできます。bd=数値とすることで立体感を出すことができます。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
btn = tkinter.Button(text="ボタン", bd=3)
btn.place(x=10, y=10)
root.mainloop()

実行するとウィンドウが開きます。

PythonでGUI入門

でもこれだとボタン押下時のイベントがありません。

btn["command"] = 関数名とすることによってボタン押下時の処理を関数で実行させるようにします。関数名の()はつけないので注意です。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
btn = tkinter.Button(text="ボタン", bd=3)
btn.place(x=10, y=10)

def event():
  root.title("ボタン押下されました!")

btn["command"] = event
root.mainloop()

実行するとウィンドウが開き、ボタンを押下するとタイトルが変わります。

PythonでGUI入門

今度はボタン押下時にラベルの表示を変更してみましょう。

label["text"] = "文字列"とすることでラベルを変更することができます。

ボタンはcommandに対し、labelはtextになります。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
btn = tkinter.Button(text="ボタン", bd=3)
btn.place(x=10, y=10)
label = tkinter.Label(text="ラベルです")
label.place(x=10, y=50)

def event():
  label["text"] = "ラベル変更!"

btn["command"] = event
root.mainloop()

実行するとウィンドウが開き、ボタンを押下するとラベルが変わります。

PythonでGUI入門

テキストボックスの入力値を取得する

テキストボックスに入力した値を取得する方法です。

テキストボックスのオブジェクトのget()を使用して取得します。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
btn = tkinter.Button(text="ボタン", bd=3)
btn.place(x=10, y=10)
text = tkinter.Entry(width=8)
text.place(x=10, y=50)
label = tkinter.Label(text="")
label.place(x=10, y=100)

def event(): 
  label["text"] = text.get()

btn["command"] = event
root.mainloop()

実行するとウィンドウが開き、ボタンを押下するとテキストボックスに入力した内容が表示されます。

PythonでGUI入門

Canvasを使う

Canvasを使えば画像やグラフを描画することができます。

とりあえずCanvasだけを表示してみます。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
canvas = tkinter.Canvas(bg="blue", width=300, height=300)
canvas.place(x=20,y=20)
root.mainloop()

実行するとウィンドウが開き、Canvas部分が背景が青色で表示されます。わかりやすいようにx軸,y軸をずらしています。

PythonでGUI入門

Canvasに画像を描画する

先ほどCanvasを配置しましたがこのCanvas内に画像(gifまたはpgm)を配置してみます。

画像を表示するにはPhotoImage()で画像オブジェクトを読み込みます。

次にCanvasにcreate_image()関数を使用して描画します。

create_image関数の引数です。

引数 意味
第一引数 x軸
第二引数 y軸
第三引数 画像ファイルパス
第四引数 タグ名(省略可)
from tkinter import Tk,Canvas,PhotoImage

root = Tk() # 省略
root.title("サンプルウィンドウ")
root.minsize(500, 500)
canvas = Canvas(bg="blue", width=300, height=300) # 省略
canvas.place(x=20,y=20)

jpg = PhotoImage(file="aaa.gif") # 省略
canvas.create_image(40, 40,image=jpg)
root.mainloop()

実行するとウィンドウが開き、Canvas部分に画像が表示されます。

PythonでGUI入門

参考サイト

import tkinterよりfrom tkinter import ~~

import tkinterと書いていましたが

from tkinter import Tk

と書いたりすることもできます。こうすると、tkinter.Tk()と書かずにTk()と書けるのでコード量が少なくなります。

複数ある場合はカンマ区切りで書けばよいです。

from tkinter import Tk, Canvas

time.sleep()でスリープする

from time import sleepを使えば、スリープさせることができます。

sleep(5)とすれば5秒スリープします。ミリ秒単位などでスリープさせたい場合はsleep(0.001)とすればミリ秒単位になります。但しマイナス値はNGです。

from tkinter import Tk,Label
from time import sleep

root = Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)

label1 = Label(text="ラベル1")
label1.place(x=10, y=50)
root.update() # 一旦アップデート
sleep(3) # 3秒スリープ
labe2 = Label(text="ラベル2")
labe2.place(x=10, y=100)
root.mainloop()

実行するとウィンドウが開き、3秒スリープされていることが確認できます。

ループする前にupdate()関数を呼んでいますが、これは強制的に画面を更新してくれます。

PythonでGUI入門

画像を移動する

Canvas内の画像を移動させることができます。coords()関数を使用します。

使い方は以下のような感じです。

canvas.coords("タグ名", x座標,y座標)

ここで、タグ名というのは、canvas.create_image()関数の第4引数になります。

from tkinter import Tk,Canvas,PhotoImage,Button

root = Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)
canvas = Canvas(bg="blue", width=300, height=300)
canvas.place(x=20,y=20)
btn = Button(text="ボタン")
btn.place(x=330, y=330)

def move():
  canvas.coords("abc",100, 100) # abcがタグ名

btn["command"] = move
jpg = PhotoImage(file="aaa.gif")
canvas.create_image(40, 40, image=jpg, tag="abc") # abcがタグ名

root.mainloop()

実行するとウィンドウが開き、ボタンを押すと画像が移動します。

PythonでGUI入門

ファイルダイアログを開く

filedialog.askopenfilename()関数を使用することによって、ファイルダイアログを開くことができます。

from tkinter import Tk,filedialog,Button

root = Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)

def fl():
  type = [('テキストファイル','*.txt')] # 拡張子が.txt
  dir = 'C:\\pg' # 初期表示時のディレクトリ
  filedialog.askopenfilename(filetypes = type, initialdir = dir)

btn = Button(text="ボタン", bd=3)
btn.place(x=10, y=10)
btn["command"] = fl
root.mainloop()

実行するとウィンドウが開き、ボタンを押すとファイルダイアログが開きます。

PythonでGUI入門

初期表示のディレクトリをカレントディレクトリにしたい場合はimport osをします。

from tkinter import Tk,filedialog,Button
import os

root = Tk()
root.title("サンプルウィンドウ")
root.minsize(500, 500)

def fl():
  type = [('テキストファイル','*.txt')] # 拡張子が.txt
  dir = os.getcwd () # カレントディレクトリにできる
  filedialog.askopenfilename(filetypes = type, initialdir = dir)

btn = Button(text="ボタン", bd=3)
btn.place(x=10, y=10)
btn["command"] = fl
root.mainloop()

実行するとウィンドウが開き、ボタンを押すとカレントディレクトリでファイルダイアログが開きます。

PythonでGUI入門

チェックボックスを表示する

チェックボックスを表示するにはCheckbutton()関数を使用します。

import tkinter

root = tkinter.Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

chk1 = tkinter.Checkbutton(text="りんご")
chk1.place(x=10, y=50)
chk2 = tkinter.Checkbutton(text="みかん")
chk2.place(x=10, y=80)

root.mainloop()

実行すると指定した座標にチェックボックスが表示されます。

PythonでGUI入門

チェックボックスをデフォルトでオンにしてみます。

BooleanVar()関数を以下のように使用します。

val = BooleanVar()
val.set(True)

このval変数をvariable = valというようにセットします。

from tkinter import Tk,Checkbutton,BooleanVar

root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

val = BooleanVar()
val.set(True)

chk1 = Checkbutton(text="りんご")
chk1.place(x=10, y=50)
chk2 = Checkbutton(text="みかん",variable = val)
chk2.place(x=10, y=80)
root.mainloop()

実行するとデフォルトでチェックされます。

PythonでGUI入門

ダイアログを表示する

messegeBox()関数を使用すればダイアログを表示することができます。

from tkinter import Tk,Button,messagebox
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

def event():
  val = messagebox.showinfo("ダイアログ", "あああ")
  print(val)

btn = Button(text="ボタン")
btn.place(x=10, y=10)
btn["command"] = event

root.mainloop()

messagebox.showinfoの使い方は以下の通りです。

第一引数…タイトル

第二引数… メッセージ

実行してボタンを押下すると、メッセージが表示されます。

ちなみに戻り値は「ok」です。

PythonでGUI入門

メニューバーを表示する

Menu()関数を使用してメニューバーを表示します。add_command()関数でメニュー追加していきます。

from tkinter import Tk,Menu
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

menu = Menu(root)
menu.add_command(label='New')
menu.add_separator()
menu.add_command(label='Files')
menu.add_command(label='Edit')
menu.add_command(label='Exit', command=root.quit)

root.config(menu=menu) # これでメニュー表示

root.mainloop()

実行するとメニューバーが表示されているのが確認できます。

PythonでGUI入門

Exitを押すと、command=root.quitが実行されるのでウィンドウが閉じます。

今度はメニューらしくFilesを押すといくつかメニューを表示してみたいと思います。

from tkinter import Tk,Menu
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

menu = Menu(root)

files_menu = Menu(menu)
files_menu.add_command(label="Open")
files_menu.add_command(label="Save")
files_menu.add_command(label="Save as...")

menu.add_cascade(label="Files", menu=files_menu) # Filesクリック時のメニューを指定する

root.config(menu=menu) # これでメニュー表示

root.mainloop()

add_cascade()関数の引数でmenu=hogehoge`みたいな感じでカスケードすれば表示されます。

PythonでGUI入門

リストボックスを表示する

Listbox()関数を使用してリストボックスを表示します。

from tkinter import Tk,Listbox
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

list = Listbox()
list.insert(0, "りんご")
list.insert(1, "みかん")
list.insert(2, "ばなな")
list.insert(3, "すいか")
list.place(x=20,y=20)

root.mainloop()

実行するとリストボックスが表示されます。

PythonのtkinterでGUI入門

リストボックスにはモード(selectmode)があって、デフォルトは一つしか選択ができないBROWSEモードになります。

モード 意味
browse デフォルト値で単一選択
single マウスの左クリックで単一選択
multiple 複数選択可能
extended 複数選択可能でctrl + クリック,shift + クリックが可

multipleで複数選択してみます。

from tkinter import Tk,Listbox
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

list = Listbox(selectmode="multiple")
list.insert(0, "りんご")
list.insert(1, "みかん")
list.insert(2, "ばなな")
list.insert(3, "すいか")
list.place(x=20,y=20)

root.mainloop()

実行すると複数選択することが可能になります。

PythonのtkinterでGUI入門

コンボボックスを表示する

コンボボックスを表示するにはttk.Combobox()関数を使用して表示します。

from tkinter import Tk,ttk
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

cb = ttk.Combobox()
cb["valu"]=("","Foo", "Bar", "Baz")
cb.set("Foo") #初期値をセット
cb.place(x=10, y=10)

root.mainloop()

実行するとコンボボックスが表示されます。初期値をBarにしてセットしていますが省略可能です。このコンボボックスではフリーフォーマットで入力することも可能です。

PythonのtkinterでGUI入門

コンボボックスの手入力を不可にする

デフォルトではコンボボックスで手入力で値を入れることができますが、

state="readonly"を指定することによって手入力を不可にすることができます。

from tkinter import Tk,ttk
root = Tk()
root.title("サンプルウィンドウ")
root.geometry("500x500")

cb = ttk.Combobox(value=("","Foo", "Bar", "Baz"),state="readonly")
cb.place(x=10, y=10)

root.mainloop()

実行すると、コンボボックスが表示されますが手入力はできない状態になります。

PythonのtkinterでGUI入門

Pythonの文法などは「Python とDjango の環境と基礎入門と使い方」を参照してください。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました