簡単アプリ作成用の準備をします。
まずウィジェット(部品とかパーツ)の貼付けと使い方が重要ですので、あとでコピペ出来るようにそれを纏めておきます。
他にもウイジェットをまとめたものが有ります。
① 基本windowを作るcode
import tkinter as tk #Python3用(Python2はTkinter)、as tkはtkinterの代わりに短く書ける root = tk.Tk() |
*画像用のPILや音源用mp3は必要に応じて入れる
*まずこれだけで次のwindowが作れる
windowを作ると何も処理を書かなくても表示されます。 エクセルをbootした状態と似ています。
まだなにも働きません。
② これにラベル、テキストボックス、コマンドボタンを配置します。
# 基本的なウインドー1.py import tkinter as tk #as tkと書くとtkinterと書かなくて済む root=tk.Tk() #元々はtkではなくtkinter #今日の日付を表示 #ラベル貼付け(文字列の書き込みはここで行う) lbl_2=tk.Label(text=”lbl_2″) lbl_3=tk.Label(text=”lbl_3″) lbl_4=tk.Label(text=”lbl_4″) lbl_5=tk.Label(text=”lbl_5″) #テキストボックス貼付け txt_3=tk.Text(root, width=13, height=1) txt_4=tk.Text(root, width=13, height=1) txt_5=tk.Text(root, width=13, height=1) #ボタン1の処理 #プログラムを中止する(決まり文句) btn_2=tk.Button(root,text=”btn_2″,width=10,command=btn2_click) root.mainloop() |
runすると次のような基本的なウインドーが出来る。
これもまだ何も動作はしませんが、run(boot)すればここまで来ます。
丁度エクセルでアプリの自動立ち上げ(Workbook_OpenとかAuto_Open)がcodeに
書き込まれているような感じですね。 Pythonの方が簡単ですね。
③ ラベル、テキストボックスの文字の変更、削除など
では、文字を書いたり変更したり、削除したりする方法を書きます(基本のキです)
1 | #部品部屋3.py 5/28/2020 |
2 | |
3 | import tkinter as tk |
4 | #import datetime |
5 | |
6 | root=tk.Tk() |
7 | root.title(“文字の書替え、追加、削除”) |
8 | root.geometry(“300×200”) |
9 | |
10 | #ラベル貼付け |
11 | #文字列は一緒に指定できるく |
12 | lbl_1=tk.Label(text=”lbl_1″) |
13 | lbl_1.place(x=20, y=20) |
14 | |
15 | lbl_2=tk.Label(text=”lbl_2″) |
16 | lbl_2.place(x=20, y=50) |
17 | |
18 | #テキストボックス貼付け |
19 | #t文字列はinsertで追加する |
20 | txt_1=tk.Entry(root, width=20) |
21 | txt_1.insert(tk.END, “txt_1”) |
22 | txt_1.place(x=100, y=20) |
23 | |
24 | txt_2=tk.Entry(root, width=20) |
25 | txt_2.insert(tk.END, “txt_2”) |
26 | txt_2.place(x=100, y=50) |
27 | |
28 | |
29 | #ボタン1の処理 |
30 | def btn1_click(): |
31 | #ラベル文字を消す |
32 | #lbl_1=tk.Label(text=””) #この方法は動作しない |
33 | lbl_1[“text”]=”” |
34 | |
35 | #ラベル文字を変更する |
36 | lbl_2[“text”]=”変更しました” |
37 | |
38 | #ボタン2の処理 |
39 | def btn2_click(): |
40 | #Entryのテキストを消す |
41 | txt_1.delete(0, tk.END) |
42 | |
43 | #Entryのテキストに追加する |
44 | txt_2.insert(tk.END, “追加しました”) |
45 | |
46 | #Entryのテキストを変更しました |
47 | txt_2.delete(0, tk.END) |
48 | txt_2.insert(tk.END, “変更しました”) |
49 | |
50 | #root.destroy() |
51 | |
52 | #コマンドボタン貼付け |
53 | btn_1=tk.Button(root,text=”btn_1(ラベル)”,width=10,command=btn1_click) |
54 | btn_1.place(x=70,y=100) |
55 | |
56 | btn_2=tk.Button(root,text=”btn_2(Entry)”,width=10,command=btn2_click) |
57 | btn_2.place(x=200,y=100) |
58 | |
59 | root.mainloop() |
これをrunさせてボタンをそれぞれ押したときの変化が下記の図です。
ボタン(ラベル)をクリックすると、lbl_1の文字が消えlbl_2の文字が変更されます。
ボタン(Entry)をクリックすると、txt_1の文字が消えtxt_2の文字が変更されます。
簡単にラベルとテキストボックス(Entry)の文字の消し方、書き方、変更の仕方を
纏めるとこうなります。
ラベルの場合:
・文字を書く時は、最初にlbl_1=tk.Label(text=”lbl_1″)等と書き込む
・文字を消す時は、lbl_1[“text”]=””と空白を書き込む感じ
・文字を変更する時は、lbl_1[“text”]=”変更しました”とする
テキストボックスの場合:
・文字を書く時は、txt_2.insert(tk.END, “追加しました”) 最後に追加する感じ
・文字を消す時は、txt_2.delete(0, tk.END) 0から最後までdeleteします
・文字を変更する時は、txt_2.insert(tk.END, “変更しました”) 必ず先の文字を
消してから追加(insert)します
左が元の文字列、右がボタンをクリックした後の変化図。
code中に簡単な処理目的をコメントしておきました。
これでやっと少し動き出しました。
④ jpgでもpngでも表示できるようにする
どちらでも使えるようなライブラリー (from PIL import Image, ImageTk)を使います。
#部品部屋4.py 5/29/2020
#jpg, png画像呼出
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.title(“jpg, png画像呼出”)
root.geometry(“350×400”)
lbl1=tk.Label(root, text = “jpgでもpngでもここに表示できます.”)
lbl1.place(x=10, y=20)
# 画像の取得
img= Image.open(‘ゆきもち草.jpg’) #プログラムと同じholderに置く
img = ImageTk.PhotoImage(img)
# 画像をラベル上に配置
label2 = tk.Label(root, image=img)
label2.place(x=25, y=50)
#終了時の決まり文句
def quit():
root.destroy()
btn2=tk.Button(root, text=’終わる’, command=quit)
btn2.place(x=250, y=350)
root.mainloop()
runすると次の図のようになる。
次はコマンドボタンで画像を張り付けます。
⑤ 処理codeを関数として書く
処理をdef show_jpg_png():と宣言してその中にどうするかのcodeを書きます。
Nextボタンをクリックすると、ここへ飛んできて
④の説明は処理動作がストレートで分かり易いですが、普通はここで書くようなに画像を関数で表示させるようにします。
その方が短るなるし分かり易い。 こう書くとすこしレベルが上がった感じがします。
1 | #jpg_png表示.py 5/27/2020 | |
2 | ||
3 | import tkinter as tk | |
4 | from PIL import Image | |
5 | from PIL import ImageTk | |
6 | ||
7 | root = tk.Tk() | |
8 | root.title(“花の名前クイズ”) | |
9 | root.geometry(“300×300”) | |
10 | ||
11 | label1=tk.Label(root, text = “jpgでもpngでもここに表示できます.”) | |
12 | label1.place(x=10, y=10) | |
13 | ||
14 | def show_jpg_png(): #コマンドボタン1から指示を受けて処理を行う | |
15 | # 画像の取得 | |
16 | global img #global宣言をすると、関数の外側でもこの変数を使る為にここで宣言が必要 | |
17 | #img= Image.open(‘1.png’) #png画像の時のテスト用 | |
18 | img= Image.open(‘カンパニューラ.jpg’) #画像表示用のライブラリー | |
19 | img = ImageTk.PhotoImage(img) #画像をimgという画像データの変数に格納する | |
20 | ||
21 | # 画像ウィジェットの配置 | |
22 | label2 = tk.Label(root, image=img) #ラベルに画像データ(img)を表示する | |
23 | label2.place(x=25, y=40) | |
24 | ||
25 | #Command Button1 #show_jpg_pngと云う自作関数へ飛ぶ | |
26 | btn1=tk.Button(root, text=’Next’, command=show_jpg_png) | |
27 | btn1.place(x=80, y=250) | |
28 | ||
29 | btn2=tk.Button(root, text=’終わる’, command=quit) | |
30 | btn2.place(x=180, y=250) | |
31 | ||
32 | def quit(): | |
33 | root.destroy() | |
34 | ||
35 | root.mainloop() |
右:Nextボタンをクリックで画像を表示
![]() | ![]() |
次は画像を次々と入れ替える準備をします。
⑥ 花のリストを準備する
別holderに入っている花のfile名でリストを作る(ここでは10個)。
その10個から四個を乱数で選び、スクリプで表示する。
#部品部屋6.py 5/30/2020 from PIL import Image,ImageTk #まだ不要だが画像表示用 flowers = [ selected_flowers = random.sample(flowers, 4) |
これをrunすると、[‘クレオメ.jpg’, ‘ジキタリス.jpg’, ‘ウキツリボク.jpg’, ‘カンパニューラ.jpg’]のように4個の花リストが出来る。
選んだ花の名前のリストを、ファイル名に変換する
#このリストから一個ずつデータとして取り出す。
#ここではその取り出したデータをselected_flowers[1~4]として表示する。
print(selected_flowers[0]) #クレオメ.jpgと画像名として取り出された
print(selected_flowers[1]) #ジキタリス.jpg
print(selected_flowers[2]) #ウキツリボク.jpg
print(selected_flowers[3]) #カンパニューラ.jpg
でも拡張子(jpg)が邪魔ですので、そのうち花の名前だけにします。
次回でウィンドーに張り付けます。
⑦ 画像の貼付けと切換
⑥の後に次のcodeを足します。
#runされた時とボタン「次へ」が押されたときの画像処理 return photo_file # NEXTボタンをクリックした時に写真をラベルに張り付ける動作 # run時に一回だけ動作する ここがややこしい所! label2 = tk.Label(root,image = img) btn1=tk.Button(root, text=’次へ’) #ボタン「終わる」が押されたときの処理 btn4 = tk.Button(root, text=’終わる’, command = destroy) root.mainloop() |
runすると次のように次々と画像が入れ替わります。
これでウインドーへ基本的なものは貼付けて動かせます。
他のウイジェットについては、ここにあります。
Python 1年間のまとめ widget編 ⑮
そして今までの部品を使って出来たのが、「花の名前を当てるクイズ」です。
プログラム(code)はそちらに載っております。
終わり