Pythonで画面を作成する
tkinterを使用して画面(ユーザーインターフェイス)を作成
from tkinter import * from tkinter import ttk root = Tk() root.mainloop()
root = Tk()
メインアプリケーションウィンドウを設定
root.mainloop()
画面に表示され、ユーザーがイベントループを操作できるようにするために必要
ボタンの配置
以下のようなドラクエの戦闘コマンド風の画面を作成する
root = Tk() # ラベル作成 commandlbl = ttk.Label(root, text="コマンド") # ボタン作成 fight = ttk.Button(root, text="たたかう") spell = ttk.Button(root, text="じゅもん") escape = ttk.Button(root, text="にげる") tool = ttk.Button(root, text="どうぐ") # ラベル・ボタン配置 commandlbl.grid() fight.grid() spell.grid() escape.grid() tool.grid() root.mainloop()
ラベル を作っても配置しないとラベルは表示されないので
commandlbl変数にラベルオブジェクトを格納した後にgrid()メソッドで配置する。
commandlbl = ttk.Label(root, text="コマンド")
commandlbl.grid()
ボタンも同様にオブジェクト作成後にgrid()メソッドで配置する。
実行結果
上から順番に縦一列に配置される。
grid()メソッドのオプションで配置場所を指定する必要がある。
ラベル・ボタン配置場所の設定
左上を起点に、0番から列(column)と行(row)で位置を指定します。
# ラベル・ボタン配置 commandlbl.grid(column=0, row=0) fight.grid(column=0, row=1) spell.grid(column=1, row=1) escape.grid(column=0, row=2) tool.grid(column=1, row=2)
実行結果
またいで設置する方法
ラベル「コマンド」が1列目に配置されているので、colspanでまたぐ列の数を指定します。
2を指定することにより、2列にまたがって表示されるようになります。
commandlbl.grid(column=0, row=0, columnspan=2)
実行結果
画像を設定する方法
ラベルのimage オプションに PhotoImage を設定することでラベル内に画像を表示します。
# 画像作成 enemy_image = PhotoImage(file='slime.png') enemylbl = ttk.Label(root,image=enemy_image) # 画像配置
enemylbl.grid(column=0, row=3, columnspan=2)
enemy_image = PhotoImage(file='slime.png')
画像のオブジェクト=PhotoImage( file=ファイルのパスと名前 )
.pngファイルをロードしオブジェクトを作成します。
enemylbl = ttk.Label(root,image=enemy_image)
Labelのtextオプションの代わりに画像のオブジェクトを指定します。
実行結果
画像のサイズを元の大きさから変更する方法
PhotoImageオブジェクトにsubsampleメソッドを使用します。
subsampleは画像を縮小して、新しいPhotoImageオブジェクトを生成するメソッドです。
第1引数には横方向、第2引数には縦方向それぞれに対する縮小率を指定します。縮小率が大きいほど、より小さく縮小されます。
第2引数を省略した場合は、第1引数で指定した縮小率で縦横両方向が縮小されます。
※引数で指定できるのは整数のみ
画像を拡大するメソッドはzoom
# 画像読み込み enemy_image = PhotoImage(file='slime.png') # 画像縮小(1/2) new_enemy_image = enemy_image.subsample(2) # ラベル(画像)作成 enemylbl = ttk.Label(root, image=new_enemy_image)
実行結果
状態と文章も表示させる
単純に追加してみる
from tkinter import * from tkinter import ttk root = Tk() herolbl = ttk.Label(root, text="ゆうしゃ") level = ttk.Label(root, text="1") levellbl = ttk.Label(root, text="レベル") hplbl = ttk.Label(root, text="HP") hp = ttk.Label(root, text="14") mplbl = ttk.Label(root, text="MP") mp = ttk.Label(root, text="0") goldlbl = ttk.Label(root, text="G") gold = ttk.Label(root, text="17") explbl = ttk.Label(root, text="E") exp = ttk.Label(root, text="1") message = ttk.Label(root, text="スライムがあらわれた!コマンド?") herolbl.grid() level.grid() levellbl.grid() hplbl.grid() hp.grid() mplbl.grid() mp.grid() goldlbl.grid() gold.grid() explbl.grid() exp.grid() message.grid() # ラベル作成 commandlbl = ttk.Label(root, text="コマンド") # ボタン作成 fight = ttk.Button(root, text="たたかう") spell = ttk.Button(root, text="じゅもん") escape = ttk.Button(root, text="にげる") tool = ttk.Button(root, text="どうぐ") # 画像読み込み enemy_image = PhotoImage(file='slime.png') # 画像縮小(1/2) new_enemy_image = enemy_image.subsample(2) # ラベル(画像)作成 enemylbl = ttk.Label(root, image=new_enemy_image) # ラベル・ボタン配置 commandlbl.grid(column=0, row=0, columnspan=2) fight.grid(column=0, row=1) spell.grid(column=1, row=1) escape.grid(column=0, row=2) tool.grid(column=1, row=2) enemylbl.grid(column=0, row=3, columnspan=2) root.mainloop()
実行結果
レイアウトが崩れます。
レイアウトを調整します
from tkinter import * from tkinter import ttk root = Tk() herolbl = ttk.Label(root, text="ゆうしゃ") level = ttk.Label(root, text="1") levellbl = ttk.Label(root, text="レベル") hplbl = ttk.Label(root, text="HP") hp = ttk.Label(root, text="14") mplbl = ttk.Label(root, text="MP") mp = ttk.Label(root, text="0") goldlbl = ttk.Label(root, text="G") gold = ttk.Label(root, text="17") explbl = ttk.Label(root, text="E") exp = ttk.Label(root, text="1") message = ttk.Label(root, text="スライムがあらわれた!コマンド?") herolbl.grid(column=0, row=0, columnspan=2) levellbl.grid(column=0, row=1) level.grid(column=1, row=1) hplbl.grid(column=0, row=2) hp.grid(column=1, row=2) mplbl.grid(column=0, row=3) mp.grid(column=1, row=3) goldlbl.grid(column=0, row=4) gold.grid(column=1, row=4) explbl.grid(column=0, row=5) exp.grid(column=1, row=5) message.grid(column=2, row=7) # ラベル作成 commandlbl = ttk.Label(root, text="コマンド") # ボタン作成 fight = ttk.Button(root, text="たたかう") spell = ttk.Button(root, text="じゅもん") escape = ttk.Button(root, text="にげる") tool = ttk.Button(root, text="どうぐ") # 画像読み込み enemy_image = PhotoImage(file='slime.png') # 画像縮小(1/2) new_enemy_image = enemy_image.subsample(2) # ラベル(画像)作成 enemylbl = ttk.Label(root, image=new_enemy_image) # ラベル・ボタン配置 commandlbl.grid(column=4, row=0, columnspan=2) fight.grid(column=4, row=1) spell.grid(column=5, row=1) escape.grid(column=4, row=2) tool.grid(column=5, row=2) enemylbl.grid(column=2, row=6) root.mainloop()
実行結果