まずは、スクリプトで動作するアプリを作ります。 開発環境はW10 x64、Python3.7.3、VS Codeです。
① 現代俳句ジェネレータ
import random first = [“コロナ禍と”, “赤い椿”, “秋深き”, “赤トンボ”, “秋空を”, “朝顔に”, “風薫る”] middle = [“気づかぬうちの”, “白い椿と”, “隣は何を”, “筑波に雲も”, “二つに絶てり”, “つるべとられて”, “おき惑わせる”, “あの日のままの”] last = [“夏の宵”, “落ちにけり”, “する人ぞ”, “なかりけり”, “椎大樹”, “もらい水”, “眺めつつ”, “乙女子ら”] while True: #エラーかqが押されるまで続く Kaminoku = random.choice(first) Nakanoku = random.choice(middle) Shimonoku = random.choice(last) #print(“\n\n”) print(Kaminoku, Nakanoku, Shimonoku) #次の表示法でもOK print(Kaminoku + ‘ ‘ + Nakanoku + ‘ ‘ + Shimonoku) #print(“\n\n”) #二行の空白 try_again = input(“\n\nTry again? (Press Enter else q to quit)\n “) if try_again.lower() == “q”: #qが押されたらストップ break input(“\nPress Enter to exit.”) |
これをrunすると;
・赤トンボ おき惑わせる 眺めつつ
・ 秋深き 気づかぬうちに 落ちにけり
などと、それなりの現代風俳句が出来上がります。
ここで学ぶことは、次のアルゴリズムです。
1.リストから乱数で要素を選択し変数に格納する
2.その変数をスクリプトで表示する
3.止めると言う迄延々と続ける
次回はこの現代俳句発生器をGUIで見やすく致します。
② GUIで使いやすくします。
import tkinter as tk root = tk.Tk() # 表示用ラベル first = [“コロナ禍と”, “赤い椿”, “秋深き”, “赤トンボ”, “秋空を”, “朝顔に”, “風薫る”] Kaminoku = random.choice(first)
show_item() root.mainloop() |
このcodeをrunすると、
左のようなもっともらしい俳句が出来上がります。
ここで学ぶことは、GUIでプログラムを書くときの基本中のキになります。
・基本ウィジェット(ラベル、コマンドボタン)の配置・位置・textの書替え
・スクリプト用codeとGUI用codeの書き方の違い
特に「次へ」と「終わり」の処理の仕方
・データ格納用のリストの使い方
・そのデータを乱数で取り出す方法(ここでは変数に格納している)
・呼び出す関数(def)は、それを呼び出すcodeより先に宣言されていること
ただ今回の出来た俳句には欠点があります。 それは無季語だったり、二重・三重季語の場合も
ありうるということです。
次回は季語を一つにしたいと思いますが、考え方としては;
1.季語の入っている各句(上五、中七、下五)に季語付きの何らかの符号を付けておく
2.季語付きholderと季語無しholderに分けておき、選択の時必ず一句に季語は一つになるように選ぶ
3.季語だけ別holderにも入れておき、出来上がった俳句と比較して無季・重複なら再度作句し直す
など簡単な方法を検討します。
③ 現代俳句ジェネレータ(完) 8/22/2020
import tkinter as tk import random class Test(): 上の句 = (“赤い椿1”, “夕立の1”, “菊の香や1”, “朝立や0”, “荒海や0”, “海に出て0”) 中の句 = (“雪を染めたる1”, “雪がふうはり1”, “春の雲あり1”, “白い椿と0”, “隣は何を0”, “筑波に雲も0”) 下の句 = (“秋の暮れ1”, “落ち葉かな1”, “散るもみぢ1”, “落ちにけり0”, “する人ぞ0”, “なかりけり0”) 季語 = ‘1’ def quit(): root.destroy() def __init__(self): self.root = tk.Tk() self.root.title(“現代俳句ジェネレータ”) self.root.geometry(‘300×200’) self.button1 = tk.Button(self.root, text=”Next”, bg=”light blue”, command=self.output_5俳句) self.button1.place(x=80, y=150) self.button2 = tk.Button(self.root, text=”End”, width=5, bg=”salmon”, command=quit) self.button2.place(x=180, y=150) self.ラベル俳句1 = tk.Label(self.root, text=”Pyhon作成俳句1″) self.ラベル俳句2 = tk.Label(self.root, text=”Pyhon作成俳句2″) self.ラベル俳句3 = tk.Label(self.root, text=”Pyhon作成俳句3″) self.ラベル俳句4 = tk.Label(self.root, text=”Pyhon作成俳句4″) self.ラベル俳句5 = tk.Label(self.root, text=”Pyhon作成俳句5″) self.ラベル俳句1.pack(pady=5) self.ラベル俳句2.pack() self.ラベル俳句3.pack(pady=5) self.ラベル俳句4.pack() self.ラベル俳句5.pack(pady=5) self.root.mainloop() def output_5俳句(self, *args): for ラベル in [self.ラベル俳句1, self.ラベル俳句2, self.ラベル俳句3, self.ラベル俳句4, self.ラベル俳句5]: ラベル[“text”] = self.俳句() def 俳句(self, *args): while True: 上 = random.choice(self.上の句) 中 = random.choice(self.中の句) 下 = random.choice(self.下の句) if self.is_俳句(上, 中, 下): return 上[:-1] + ” ” + 中[:-1] + ” ” + 下[:-1] def is_俳句(self, 上, 中, 下): 季語_count = sum(季語 in 句 for 句 in (上, 中, 下) for 季語 in self.季語) if 季語_count == 1: return True # else: #上のif文で必ず季語一個の句が出来るので、elseは不要となる # return False Test() |
これをbootすると次のような図が表示されます。 俳句例が少ないので、まだ傑作には行き当たりませんが、増やしていけばきっと・・・・
ここで学習したこと;
・先人の作例を応用するには、まずクラスの理解が必要となります
・bootで即プログラムをスタートさせるには、クラスに入れてそれを最初に始動させるのがよい
・季語を一個にする方法は、codeの簡単さ・可読性を重点に置き各句の最後に季語符号をつけました
・季語が一個になるまでの繰返しの処理方法を、しっかり理解し記憶する必要があるとかんじました