部品部屋(ウインドー)⑦ 終わり

簡単アプリ作成用の準備をします。

まずウィジェット(部品とかパーツ)の貼付けと使い方が重要ですので、あとでコピペ出来るようにそれを纏めておきます。

他にもウイジェットをまとめたものが有ります。

 

① 基本windowを作るcode

import tkinter as tk #Python3用(Python2はTkinter)、as tkはtkinterの代わりに短く書ける
import random #乱数発生用
from PIL import Image, ImageTk #jpg, png表示用
import pygame #mp3用

root = tk.Tk()
root.geometry(‘400×300’)
root.title(‘アプリの名前’)

・ここに必要な処理をプログラムする

root.mainloop()

 

*画像用のPILや音源用mp3は必要に応じて入れる
*まずこれだけで次のwindowが作れる

 

windowを作ると何も処理を書かなくても表示されます。 エクセルをbootした状態と似ています。
まだなにも働きません。


 

 

② これにラベル、テキストボックス、コマンドボタンを配置します。

# 基本的なウインドー1.py

import tkinter as tk  #as tkと書くとtkinterと書かなくて済む
import datetime #日付、時間の表示用

root=tk.Tk()  #元々はtkではなくtkinter
root.title(“基本ウインドー”)
root.geometry(“350×300”)

#今日の日付を表示
today = datetime.date.today()
lbl_0=tk.Label(text=today)
lbl_0.place(x=250,y=10)

#ラベル貼付け(文字列の書き込みはここで行う)
lbl_1=tk.Label(text=”lbl_1″)
lbl_1.place(x=20, y=20)

lbl_2=tk.Label(text=”lbl_2″)
lbl_2.place(x=20, y=50)

lbl_3=tk.Label(text=”lbl_3″)
lbl_3.place(x=20, y=80)

lbl_4=tk.Label(text=”lbl_4″)
lbl_4.place(x=20, y=110)

lbl_5=tk.Label(text=”lbl_5″)
lbl_5.place(x=20, y=140)

#テキストボックス貼付け
txt_1=tk.Text(root, width=13, height=1)
txt_1.insert(tk.END, “txt_1”)
txt_1.place(x=70, y=20)

#文字列の書き込みはinsertを使う
#Textを使うと複数行の書き込みが出来る
#一行で良ければ、Entryを使う
txt_2=tk.Text(root, width=13, height=1)
txt_2.insert(tk.END, “txt_2”)  
txt_2.place(x=70, y=50)

txt_3=tk.Text(root, width=13, height=1)
txt_3.insert(tk.END, “txt_3”)
txt_3.place(x=70, y=80)

txt_4=tk.Text(root, width=13, height=1)
txt_4.insert(tk.END, “txt_4”)
txt_4.place(x=70, y=110)

txt_5=tk.Text(root, width=13, height=1)
txt_5.insert(tk.END, “txt_5”)
txt_5.place(x=70, y=140)

#ボタン1の処理
def btn1_click():
    pass #まだ何も決まっていないときに書いて置いておく。 そうしないとerrorとなる。

#プログラムを中止する(決まり文句)
def btn2_click():
    root.destroy()

#コマンドボタン貼付け、commandへ飛び先を指定する
btn_1=tk.Button(root,text=”btn_1″,width=10,command=btn1_click)
btn_1.place(x=70,y=200)

btn_2=tk.Button(root,text=”btn_2″,width=10,command=btn2_click)
btn_2.place(x=200,y=200)

root.mainloop()

 

runすると次のような基本的なウインドーが出来る。

 

これもまだ何も動作はしませんが、run(boot)すればここまで来ます。
丁度エクセルでアプリの自動立ち上げ(Workbook_OpenとかAuto_Open)がcodeに
書き込まれているような感じですね。 Pythonの方が簡単ですね。


 

③ ラベル、テキストボックスの文字の変更、削除など

では、文字を書いたり変更したり、削除したりする方法を書きます(基本のキです)

1#部品部屋3.py  5/28/2020  
2 
3import tkinter as tk
4#import datetime
5 
6root=tk.Tk()
7root.title(“文字の書替え、追加、削除”)
8root.geometry(“300×200”)
9 
10#ラベル貼付け
11#文字列は一緒に指定できるく
12lbl_1=tk.Label(text=”lbl_1″)
13lbl_1.place(x=20, y=20)
14 
15lbl_2=tk.Label(text=”lbl_2″)
16lbl_2.place(x=20, y=50)
17 
18#テキストボックス貼付け
19#t文字列はinsertで追加する
20txt_1=tk.Entry(root, width=20)
21txt_1.insert(tk.END, “txt_1”)
22txt_1.place(x=100, y=20)
23 
24txt_2=tk.Entry(root, width=20)
25txt_2.insert(tk.END, “txt_2”)
26txt_2.place(x=100, y=50)
27 
28 
29#ボタン1の処理
30def btn1_click():
31    #ラベル文字を消す
32    #lbl_1=tk.Label(text=””) #この方法は動作しない
33    lbl_1[“text”]=””
34 
35    #ラベル文字を変更する
36    lbl_2[“text”]=”変更しました”
37 
38#ボタン2の処理
39def 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#コマンドボタン貼付け
53btn_1=tk.Button(root,text=”btn_1(ラベル)”,width=10,command=btn1_click)
54btn_1.place(x=70,y=100)
55 
56btn_2=tk.Button(root,text=”btn_2(Entry)”,width=10,command=btn2_click)
57btn_2.place(x=200,y=100)
58 
59root.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 
 3import tkinter as tk
 4from PIL import Image
 5from PIL import ImageTk 
 6 
 7root = tk.Tk()
 8root.title(“花の名前クイズ”)
 9root.geometry(“300×300”)
 10 
 11label1=tk.Label(root, text = “jpgでもpngでもここに表示できます.”)
 12label1.place(x=10, y=10)
 13 
 14def 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と云う自作関数へ飛ぶ
 26btn1=tk.Button(root, text=’Next’, command=show_jpg_png)
 27btn1.place(x=80, y=250)   
 28 
 29btn2=tk.Button(root, text=’終わる’, command=quit)
 30btn2.place(x=180, y=250) 
 31 
 32def quit():
 33    root.destroy()
 34 
 35root.mainloop()

 

右:Nextボタンをクリックで画像を表示

 

次は画像を次々と入れ替える準備をします。


 

⑥ 花のリストを準備する
別holderに入っている花のfile名でリストを作る(ここでは10個)。
その10個から四個を乱数で選び、スクリプで表示する。

#部品部屋6.py 5/30/2020
#花のリストから4個jpgを選ぶ(pngでも良い)

from PIL import Image,ImageTk #まだ不要だが画像表示用 
import random 乱数発生関数

flowers = [
    ’ウキツリボク.jpg’,
                ‘オンジューム.jpg’,
                ‘カタバミ.jpg’,
                ‘カンパニューラ.jpg’,
                ‘キンシバイ.jpg’,
                ‘クレオメ.jpg’,
                ‘クンシラン.jpg’,
                ‘ジキタリス.jpg’,
                ‘シューカイドウ.jpg’,
                ‘ムスカリ.jpg’,
                ]

selected_flowers = random.sample(flowers, 4)
print(selected_flowers)

 

これを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された時とボタン「次へ」が押されたときの画像処理
def select_img_file():
    ran = random.sample(flowers, 4)
    photo_file = ran
    photo_file = photo_file[0]

    return photo_file

# NEXTボタンをクリックした時に写真をラベルに張り付ける動作
# runの時は動作していない
def push_next_button(event):
    img_next = Image.open(select_img_file())
    img_next = ImageTk.PhotoImage(img_next)
    label2.configure(image = img_next)
    label2.photo = img_next

# run時に一回だけ動作する ここがややこしい所!
#run時にここからselect_img_file()へ飛ぶ。

#そこで選択されたphoto_file[0]をreturnで持ち帰り、imgと云う変数に代入する。
#その次の行で画像データに変換し、表示できる形にしてラベルに張り付ける。
img = Image.open(select_img_file())
img = ImageTk.PhotoImage(img)

label2 = tk.Label(root,image = img)
label2.pack(side = “bottom”, fill = “both”, expand = “yes”)
label2.place(x=40,y=30)

btn1=tk.Button(root, text=’次へ’)
btn1.place(x=50 ,y=330)
btn1.bind(“<1>”, push_next_button)

#ボタン「終わる」が押されたときの処理
def destroy():
    root.destroy()

btn4 = tk.Button(root, text=’終わる’, command = destroy)
btn4.place(x=150, y=330)

root.mainloop()

 

runすると次のように次々と画像が入れ替わります。

 

これでウインドーへ基本的なものは貼付けて動かせます。 

他のウイジェットについては、ここにあります。

Python 1年間のまとめ widget編 ⑮

 

そして今までの部品を使って出来たのが、「花の名前を当てるクイズ」です。
プログラム(code)はそちらに載っております。

 

終わり

 

 

 

 

 

Python小学館
リストのデータを合算する(ブラックジャックに使用する)

トランプのブラックジャック(BJ)を作るための準備として、点数計算用の関数を作ります。BJはdeal …

Python別館
Python検定試験準備 Q37

Python検定試験と云うのがあるらしいと別項に上げましたが、学習して損することは無いので始めて見ま …

Python小学館
リストボックスから選択する

アプリを作るときによくリストボックスから選択したい場合がよく有ります。 忘れがちなのでここ …