有名和歌集を作ろう

先の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(‘500×250’)
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)

 

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

1def 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_データ())を作成する

17def 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別館
ブラックジャックを作るー4

初心者の僕には難しいですが、ラスベガスで負け続けたカードゲームの「Black Jack」を作ってみま …

Python別館
Python別館 目次

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

Python別館
脳トレの勧め 2/2

前回は、辞書に三つの要素を入れる術が分からなかったので、策を弄して取敢えずは動くように出来ました。で …