Pythonで画面を作成する

tkinterを使用して画面(ユーザーインターフェイス)を作成

tkinterPythonの標準GUIツールキット

 

from tkinter import *
from tkinter import ttk
root = Tk()
root.mainloop()

 

root = Tk()

メインアプリケーションウィンドウを設定

 

root.mainloop()

画面に表示され、ユーザーがイベントループを操作できるようにするために必要

 

f:id:antoniomarin:20210125151111p:plain

 

ボタンの配置

以下のようなドラクエの戦闘コマンド風の画面を作成する

 

f:id:antoniomarin:20210131100917p:plain

 

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()メソッドのオプションで配置場所を指定する必要がある。

f:id:antoniomarin:20210131103014p:plain


ラベル・ボタン配置場所の設定

左上を起点に、0番から列(column)と行(row)で位置を指定します。

f:id:antoniomarin:20210131104908p:plain

 

# ラベル・ボタン配置
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)


実行結果
f:id:antoniomarin:20210131105223p:plain

 

またいで設置する方法

ラベル「コマンド」が1列目に配置されているので、colspanでまたぐ列の数を指定します。

2を指定することにより、2列にまたがって表示されるようになります。

 

commandlbl.grid(column=0, row=0, columnspan=2)

 

実行結果

f:id:antoniomarin:20210131161236p:plain

 

画像を設定する方法

ラベルの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オプションの代わりに画像のオブジェクトを指定します。

 

実行結果

f:id:antoniomarin:20210131175629p:plain

 

画像のサイズを元の大きさから変更する方法

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)

 

 実行結果

f:id:antoniomarin:20210201143228p:plain

 

状態と文章も表示させる

f:id:antoniomarin:20210201151723p:plain

f:id:antoniomarin:20210201151909p:plain

 

単純に追加してみる

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()

実行結果

レイアウトが崩れます。

f:id:antoniomarin:20210201171443p:plain

 

レイアウトを調整します

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()

実行結果

f:id:antoniomarin:20210201193032p:plain