有名和歌集を作ろう

先のQ&Aである程度のクイズ形式のPythonの学習ができましたので、
今回は日本古来の和歌のお勉強をします。

やり方は;

*まず有名和歌20歌をテキストファイルにします。
*暫定formを作る。
・tkinter、random関数をimport
・ラベル、テキストbox、コマンドボタン(スタート、終わり)を配置
*codeの概略
・keyで呼び出しできる和歌辞書用関数を作る(def read_和歌群())
・乱数に応じた和歌を辞書より取り出す関数を作る(def show_データ())
・取り出したkey・要素を和歌・歌人と云う変数に入れる
・その変数に格納された和歌・歌人を表示する(Show_データ)
・command1でスタート・次の和歌を表示させる(表示関数宣言後に書く)
・command2でプログラム終了 (終了関数宣言後に書く)

この順序に従いプログラムを書いていきます。

 

==========================

 

① 和歌20選のテキストファイルを作る。

1 秋来ぬと 目にはさやかに見えねども 風の音にぞおどろかれぬる 藤原敏行
2 秋の野に 咲きたる花を指(および)折り かき数ふれば七種(ななくさ)の花 山上憶良
3 天つ風 雲の通ひ路吹き閉ぢよ をとめの姿しばしとどめむ 僧正遍照
4 天の原 ふりさけみれば春日なる 三笠の山に出(いで)し月かも 安倍仲麿
5 あをによし 奈良の都は咲く花の にほふがごとく今さかりなり 小野老(おのの おゆ)
6 いにしへの 奈良の都の八重桜 けふ九重ににほひぬるかな 伊勢大輔
7 大海の いそもとどろに寄する波 われてくだけて さけて散るかも 源実朝
8 奥山に 紅葉踏みわけ鳴く鹿の 声きく時ぞ秋は悲しき 猿丸大夫
9 かささぎの 渡せる橋におく霜の 白きを見れば夜ぞ更けにける 大伴家持
10 君がため 惜しからざりし命さへ 長くもがなと思ひけるかな 藤原義孝
11 こちふかば 匂ひおこせよ梅の花 あるじなしとて春な忘れそ 菅原道真
12 銀(しろかね)も 金(くがね)も玉も何せむに まされる宝子にしかめやも 山上憶良
13 田子の浦に うち出でて見れば白妙の 富士の高嶺に雪は降りつつ 山部赤人
14 月みれば 千々(ちぢ)に物こそ悲しけれ 我が身ひとつの秋にはあらねど 大江千里(おおえのちさと) 
15 花の色は 移りにけりないたづらに わが身世にふるながめせしまに 小野小町
16 春過ぎて 夏来にけらし白妙の 衣干すてふ天の香具山 持統天皇
17 東(ひんがし)の 野にかぎろいの立つ見えて かえりみすれば 月かたぶきぬ 柿本人麻呂
18 見わたせば 花ももみじもなかりけり 浦のとまやの秋の夕ぐれ 藤原定家
19 世の中に たえて桜のなかりせば 春の心はのどけからまし 在原業平
20 我が園に 梅の花散る久かたの 天より雪の流れ来るかも 大伴旅人
       

 

② 暫定formを作る。

 

 

③ formのcodeを書く

 コマンドボタンの表示だけしておき、処理部分は表示関数の作成後にプログラムする。
 表示関数より先にコマンド処理の指定はできないので。

 

import tkinter as tk
import random

root = tk.Tk()

root.geometry('500x250')
root.title('有名和歌')

# Label
lbl1 = tk.Label(text='和歌:')
lbl1.place(x=10, y=30)
lbl2 = tk.Label(text='歌人:')
lbl2.place(x=10, y=80)

# Text(Entry)
txt1 = tk.Entry(width=60)
txt1.place(x=60, y=30)
txt2 = tk.Entry(width=30)
txt2.place(x=60, y=80)

#Command Button1
btn1=tk.Button(root, text='開始/次へ')
btn1.place(x=100, y=150)

btn2=tk.Button(root, text='終わる')
btn2.place(x=200, y=150)

 

④ すべての和歌を読込み辞書を作る

1 def read_和歌群():#全和歌を読み込む
2     file = open('有名和歌20選読込1.txt','r', encoding='utf_8')
3     lines = file.readlines()
4     file.close()
5  
6     和歌_和歌群 = [] # 最初の要素「和歌」のリストを設定
7     歌人_和歌群 = [] # 二番目の要素「歌人」のリストを設定
8  
9     line_count = 0 #和歌数用カウンター
10     for line in lines:
11         要素 = line.rsplit("\t") #tabで区切ったファイルの場合
12         if len(要素) == 2:  # 要素2個をそれぞれのlistへ追加する
13             和歌_和歌群.append(要素[0])  # 英単語をlistへadd
14             歌人_和歌群.append(要素[1])  # 意味をlistへadd
15             line_count += 1
16     return line_count,[和歌_和歌群, 歌人_和歌群]  # 和歌がなくなるまで繰り返す

 

⑤ 辞書から和歌・歌人を取り出して表示する関数(show_データ())を作成する

17 def show_データ(count,num, 和歌_和歌群, 歌人_和歌群):  # 乱数に応じた要素を表示する関数  
18     和歌 = 和歌_和歌群[num]  # 英単語を和歌に格納  
19     歌人 = 歌人_和歌群[num]  
20    
21    #ボタン1(開始/次)の関数  
22     def  和歌_Show(event):  
23         乱数 = random.randrange(0, count)  
24         #print(f'num={num}') #変数numの表示  
25         和歌 = 和歌_和歌群[乱数]  # 和歌に格納  
26         歌人 = 歌人_和歌群[乱数]  
27    
28         txt1.delete(0, tk.END)  
29         txt2.delete(0, tk.END)  
30    
31         txt1.insert(0, f' {和歌}')  #txt1.insert(tk.END, 和歌)でもOK  
32         txt2.insert(0, f' {歌人}')  
33    
34     btn1.bind("<Button>", 和歌_Show)  
        

 

 

⑥ 表示関数が出来たので、こっれでやっと表示するというコマンドが使える

     次のcodeによってやっと上の関数を表示できます(それが行39へ飛んで行34で和歌_Show()で行います)。

    35   count, 和歌群 = read_和歌群()
    36    和歌_和歌群 = 和歌群[0]
    37    歌人_和歌群 = 和歌群[1]
    38    乱数 = random.randrange(0, count)
    39    show_データ(count, 乱数, 和歌_和歌群, 歌人_和歌群)

 

⑦ 最後に終わりのコマンドで終了です、これは簡単です。

    40   def destroy():
    41        root.destroy() 
    42
    43    btn2=tk.Button(root, text='終わり', command=destroy)
    44    brn2.place(x=200, y=150)
    45
    46    root.mainloop()

 

必要な関数を先に定義するところが混乱の元ですが、慣れるよりほかにありませんね。

⑧ 動作図

 

 

 

 

 

 

 

終わり

 

 

Python別館
Python別館 目次

Pythonで作成したアプリ関連の記事は「Python別館」に、widgetやその使用方法・それを使 …

Python別館
Q&A テンプレート GUI編

良く英単語アプリなどを作る時に似たようなアプリになりますので、すぐ真似できるようにテンプレートらしき …

Python別館
文字列の配置

ラベル、テキストボックスなどで、文字列の配置が微妙に異なります。 いつも迷うので基本的なものを挙げて …