PythonのtkinterでGUI入門
PythonではGUIプログラムも作成することができてしまいます。
バージョン |
---|
v3.6.2 |
tkinterをimportすれば簡単に作成できます。
C:\>python sample001.py
sample001.py
import tkinter root = tkinter.Tk() root.mainloop()
実行するとウィンドウが開きます。
右上の✖印で閉じます。
ウィンドウのタイトルが「tk」になっているので変更します。デフォルトウィンドウサイズも変更してみます。
C:\>python sample001.py
sample001.py
import tkinter root = tkinter.Tk() root.title("サンプルウィンドウ") root.minsize(500, 500) root.mainloop()
実行するとウィンドウが開きます。
ウィンドウのタイトルとデフォルトウィンドウサイズが変わっていることが確認できます。
テキストラベルをウィンドウに表示する
ウィンドウにラベルを表示してみます。
import tkinter root = tkinter.Tk() root.title("サンプルウィンドウ") root.minsize(500, 500) text = tkinter.Label(text="年齢を入力してください") text.place(x=0, y=0) root.mainloop()
実行するとウィンドウが開きます。
変数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()
実行するとウィンドウが開きます。
tkinter.Entry(width=8, bd=4)
というようにbd=4
とするとテキストボックスのボーダーが立体的になります。
テキストボックスにデフォルト値を入力しておく
テキストボックスは普通に表示すれば空ですが、デフォルト値を設定することもできます。
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()
実行するとテキストボックスにデフォルト値が入っています。
テキストボックスの入力値をクリアする
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文字ずつ削除されていきます。
ボタンを表示する
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()
実行するとウィンドウが開きます。
ボタンのボーダーを変更することもできます。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()
実行するとウィンドウが開きます。
でもこれだとボタン押下時のイベントがありません。
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()
実行するとウィンドウが開き、ボタンを押下するとタイトルが変わります。
今度はボタン押下時にラベルの表示を変更してみましょう。
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()
実行するとウィンドウが開き、ボタンを押下するとラベルが変わります。
テキストボックスの入力値を取得する
テキストボックスに入力した値を取得する方法です。
テキストボックスのオブジェクトの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()
実行するとウィンドウが開き、ボタンを押下するとテキストボックスに入力した内容が表示されます。
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軸をずらしています。
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部分に画像が表示されます。
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()関数を呼んでいますが、これは強制的に画面を更新してくれます。
画像を移動する
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()
実行するとウィンドウが開き、ボタンを押すと画像が移動します。
ファイルダイアログを開く
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()
実行するとウィンドウが開き、ボタンを押すとファイルダイアログが開きます。
初期表示のディレクトリをカレントディレクトリにしたい場合は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()
実行するとウィンドウが開き、ボタンを押すとカレントディレクトリでファイルダイアログが開きます。
チェックボックスを表示する
チェックボックスを表示するには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()
実行すると指定した座標にチェックボックスが表示されます。
チェックボックスをデフォルトでオンにしてみます。
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()
実行するとデフォルトでチェックされます。
ダイアログを表示する
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」です。
メニューバーを表示する
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()
実行するとメニューバーが表示されているのが確認できます。
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`みたいな感じでカスケードすれば表示されます。
リストボックスを表示する
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()
実行するとリストボックスが表示されます。
リストボックスにはモード(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()
実行すると複数選択することが可能になります。
コンボボックスを表示する
コンボボックスを表示するには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
にしてセットしていますが省略可能です。このコンボボックスではフリーフォーマットで入力することも可能です。
コンボボックスの手入力を不可にする
デフォルトではコンボボックスで手入力で値を入れることができますが、
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の文法などは「Python とDjango の環境と基礎入門と使い方」を参照してください。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント