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(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^





























コメント