現代俳句ジェネレーター (完)

まずは、スクリプトで動作するアプリを作ります。 開発環境は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
import random

root = tk.Tk()
root.title(“現代俳句ジェネレータ”)
root.geometry(“220×180”)

# 表示用ラベル
label_1 = tk.Label(text=”show_item”, bg=”yellow”)
label_1.place(x=30, y=50)

first = [“コロナ禍と”, “赤い椿”, “秋深き”, “赤トンボ”, “秋空を”, “朝顔に”, “風薫る”]
middle = [“気づかぬうちに”, “白い椿と”, “隣は何を”, “筑波に雲も”,
“二つに絶てり”, “つるべとられて”, “おき惑わせる”, “あの日のままの”]
last = [“夏の宵”, “落ちにけり”, “する人ぞ”, “なかりけり”, “椎大樹”, “もらい水”, “眺めつつ”, “乙女子ら”]

Kaminoku = random.choice(first)
Nakanoku = random.choice(middle)
Shimonoku = random.choice(last)


def show_item():
Kaminoku = random.choice(first)
Nakanoku = random.choice(middle)
Shimonoku = random.choice(last)
#print(Kaminoku, Nakanoku, Shimonoku)
text = Kaminoku + ‘ ‘ + Nakanoku + ‘ ‘ + Shimonoku
label_1[“text”] = text


button_1 = tk.Button(root, text=”Next”, width=5,
bg=”light blue”, command=show_item)
button_1.place(x=40, y=100)


def quit():
root.destroy()


button_1 = tk.Button(root, text=”End”, width=5, bg=”salmon”, command=quit)
button_1.place(x=120, y=100)

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の簡単さ・可読性を重点に置き各句の最後に季語符号をつけました
・季語が一個になるまでの繰返しの処理方法を、しっかり理解し記憶する必要があるとかんじました

 

 

 

 

Python別館
Python検定試験準備 Q37

Python検定試験と云うのがあるらしいと別項に上げましたが、学習して損することは無いので始めて見ま …

Python別館
WordPressのサイトにcodeを載せたい

editorのせいか自分の知識不足のせいか分かりませんが、ここにPythonのcodeを書くと見かけ …

Python別館
Python別館 目次

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