名俳句鑑賞ソフト GUI(tkinter)完成品

やっと完成しました。

少し長けれど書いておきます。

今までの問題点は、乱数に応じた俳句に変わらないというものでした。

色々探ると原因が分かりました。 まだPythonのルールをしっかりと理解していなかったことが原因でした。
どういうことかというと、
・俳句表示は、GUI立ち上げのときに乱数が発生する構造になっていた。
・すると新句ボタンを押しても、乱数・表示の処理が行われない。
・そこで、新句ボタンをの中に乱数・表示処理を持ってきた。
と言うものでした。

① それが以下のcodeです。

————————————-

root = tk.Tk()
root.title(‘有名俳句202句’)
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)

def read_words():
 file = open(‘有名俳句202句.txt’,’r’, encoding=’utf_8′)
 lines = file.readlines()
 file.close()

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

 line_count = 0 #句数カウンター
 for line in lines:
  # line = line.rstrip(“\n”) #有ってもなくても変化いみたい
  name = line.rsplit(“\t”)
  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
   line_count += 1
 return line_count,[h_words, a_words, s_words] # txtがなくなるまで繰り返す


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

 #ボタン1(俳句作る)の関数 OK
 def HaikuShow(event):
  num = random.randrange(0, count)
  #print(f’num={num}’) #変数numの表示
  h_word = h_words[num] # 俳句をh_wordに格納
  a_word = a_words[num]
  s_word = s_words[num]

  txt1.delete(0, tk.END)
  txt2.delete(0, tk.END)
  txt3.delete(0, tk.END)

  txt1.insert(0, f’ {h_word}’) #txt1.insert(tk.END, h_word)でもOK
  txt2.insert(0, f’ {a_word}’)
  txt3.insert(0, f’ {s_word}’)
 btn1.bind(“<Button>”, HaikuShow)

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

num = random.randrange(0, count)
show_data(count,num, h_words, a_words, s_words)

def destroy():
 global root
 root.destroy()

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

def destroy():
 global root
 root.destroy()

btn2=tk.Button(root, text=’終わる’, command=destroy)

root.mainloop()

  ————————————-

注意したところは下記です。
・GUIを閉じるときの処理でglobal変数としているところ
・自作関数のindent位置とglobal関数の関係です

以上何とか動作するようになりましたが、色々参考書やネットでのcodeを利用させてもらってます。

有難うございました。

 

② このアプリを他のPCでも動作するように、exeファイルを作りました。

それを図に載せておきます。

 

 

 

 

この稿終わり。

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

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

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

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

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

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