名俳句鑑賞ソフト GUI(tkinter)編

commandラインでのアプリは余り面白みがないので、やはりGUIで作りましょう。

Pythonに付属のGUIであるtkinterを使います。

 

① まず空のtkinterの表示画面(ウインドー)を作ります

import tkinter as tk

root = tk.Tk()
root.title(‘俳句10句’)
root.geometry(‘350×250’)

 

② 必要なウイジェット(部品)を張り付けよう

 ①の後に続いけて、次のcodeを書きます


#btn.click関数を先に作る
def btn1_click():
 pass passは何も処理なしのとき(後で書くときに使う)


def btn2_click():
 pass

#Label貼付け
lbl1=tk.Label(text=’俳句’)
lbl1.place(x=30,y=30)
lbl2=tk.Label(text=’作者’)
lbl2.place(x=30,y=60)
lbl3=tk.Label(text=’季節’)
lbl3.place(x=30,y=90)

#Text(Entry) テキストボックス貼付け
txt1=tk.Entry(width=40)
txt1.place(x=70, y=30)
txt2=tk.Entry(width=15)
txt2.place(x=70, y=60)
txt3=tk.Entry(width=15)
txt3.place(x=70, y=90)

#Command Button コマンドボタン貼付け
btn1=tk.Button(root, text=’開始/次へ’, command=btn1_click)
btn1.place(x=70, y=150)
btn2=tk.Button(root, text=’終了’, command=btn2_click)
btn2.place(x=230, y=150)

root.mainloop()

runすると次のようなウインドーが立ち上がります。
部品もしっかりと装着されました。

 

③ 動作確認

command buttonが動作しているかどうかの確認をします。

def btn1_click():
 #pass passは何も処理なしのとき(後で書くときに使う)<– これをコメント化して次を追加する
 txt1.insert(0, ‘赤い椿白い椿と落ちにけり’) #最初の位置から’赤い椿・・・’と追加する命令が出る

def btn2_click():
 #pass <– これをコメント化して次を追加する
 txt1.delete(0,tk.END) #最初の位置から全部消す(deleteする)。

runした後、開始/次へボタンをクリックすると、次のように俳句が表示されます。

当たり前の結果ですが、ボタンの動作確認が出来ました。
次に終了ボタンをクリックすると、俳句が消えますね、これで動作確認はOKです。

 

 

これから先に作った乱数による俳句表示となるわけですが、苦労しそうです。

④ 苦労してます

以前の複数のcodeを組み合わせているので、まだ上手く行ってませんが乱数に応じた俳句の表示・消すところまでいきました。

新しくcodeを書きます。

from time import sleep
import random
import tkinter as tk

root = tk.Tk()
root.title(‘俳句10句’)
root.geometry(‘350×250’) # 大きさの単位はピクセル、ラベルなどの単位とは違うようだ?

# Label
lbl1 = tk.Label(text=’俳句’)
lbl1.place(x=30, y=30)
lbl2 = tk.Label(text=’作者’)
lbl2.place(x=30, y=60)
lbl3 = tk.Label(text=’季節’)
lbl3.place(x=30, y=90)

# Text(Entry)
txt1 = tk.Entry(width=40)
txt1.place(x=70, y=30)
txt2 = tk.Entry(width=15)
txt2.place(x=70, y=60)
txt3 = tk.Entry(width=15)
txt3.place(x=70, y=90)

#Command Button #commandは後で指示する
btn1=tk.Button(root, text=’開始/次へ’)
btn1.place(x=70, y=150)
btn2=tk.Button(root, text=’終了’)
btn2.place(x=230, y=150)

def read_words():
 file = open(“俳句1.txt”)
 lines = file.readlines()
 file.close()

 h_words = [] # haiku list
 a_words = [] # auther list
 s_words = [] # season list

 for line in lines:
  # line = line.rstrip(“\n”) #有ってもなくても変化いみたい
  name = line.rsplit(“ ”)
  if len(name) == 3: # 要素3個をそれぞれのlistへ追加する
   h_words.append(name[0]) # 俳句をlistへadd
   a_words.append(name[1]) # 作者をlistへadd
   s_words.append(name[2]) # 季節をlistへadd
   return [h_words, a_words, s_words] # txtがなくなるまで繰り返す

def show_data(num, h_words, a_words, s_words): # 乱数に応じた要素を表示する関数
 h_word = h_words[num] # 俳句をh_wordに格納
 a_word = a_words[num]
 s_word = s_words[num]
 #print(h_word, end=”) #俳句を表示 OK

 # sleep(1) # 改行なし 1秒後表示
 # print(” : ” + h_word +” ” + a_word + ” ” + s_word) # OK

 #ボタン1(俳句作る)の関数 OK
 def HaikuShow(event):
  txt1.insert(0, h_word) #txt1.insert(tk.END, h_word)でもOK
  txt2.insert(0, a_word)
  txt3.insert(0, s_word)
 btn1.bind(“<Button>”, HaikuShow)

words = read_words()
h_words = words[0]
a_words = words[1]
s_words = words[2]

# sleep(2) #まだ使用していない
num = random.randrange(0, 9)
#print(num) #OK
show_data(num, h_words, a_words, s_words)

#ボタン2(消す)の関数
def DeleteEntryValue(event):
 txt1.delete(0, tk.END)
 txt2.delete(0, tk.END)
 txt3.delete(0, tk.END)
btn2.bind(“<Button>”, DeleteEntryValue)

root.mainloop()

———————-

runすると図のように乱数に応じた俳句の表示までできました。

終了ボタンで消えますが、次の俳句が出来てこない(出来てるけれど表示がうまく行かない)

 

続く。

完成品は別稿でアップします。

 

 

 

 

Python別館
被写体の明るさ(EV)計算機を作る ④

数年前にフォトマスター検定の受験用に、VisualBasicでEV計算機を作成したことが有りました。 …

Python別館
Python スクレイピング ①

スクレイピングでデータを効率的に活用すれば、業務を効率化できたり、生産性を高めたりといった効果が期待 …

Python別館
百人一首学習アプリ ー 完成編

一つの乱数を他の関数ででも使えるようにしましたので、全て欲しい処理が可能になりました。 ・まず最初に …