--- Title: AIform File Author: python0705 Web: https://mimemo.io/m/5dn7jlK9ZZGr9Ye --- import tkinter as tk from kuri import * """グローバル変数の定義 """ entry = None #入力エリアのオブジェクトを保持 response_area = None #応答エリアのオブジェクトを保持 lb = None #ログ表示用リストボックスを保持 action = None #オプションメニューの状態を保持 kuri = Kuri('くりちゃん') #Kuriオブジェクトを保持 def putlog(str): """対話ログをリストボックスに追加する関数 @str 入力文字列または応答メッセージ """ lb.insert(tk.END,str) def prompt(): """クリちゃんのプロンプトを作る関数 """ k = kuri.name if (action.get()) == 0: k+= ':' + kuri.responder.name return k+ '>' def talk(): """対話を行う関数 Kuriクラスのdialogue()メソッドを実行して応答メッセージを取得 入力文字列及び、応答メッセージをログに出力 """ value = entry.get() #入力エリアが未入力の場合 if not value: response_area.configure(text = 'なにクリ?') #入力されていたら対話オブジェクトを実行 else: #入力文字列を引数にしてdialogue()メソッドの結果を取得 response = kuri.dialogue(value) #応答メッセージを表示 response_area.configure(text = response) #入力文字列引数にしてputlog()を呼ぶ putlog('>' + value) #応答メッセージを引数にしてputlog()を呼ぶ putlog(prompt() + response) #入力エリアをクリア entry.delete(0,tk.END) #--------------------------------------------------------------------------------------------- #画面を描画する関数 #---------------------------------------------------------------------------------------------- def run(): #グローバル変数を使用するための記述 global entry, response_area,lb,action #メインウインドウを作成 gamen = tk.Tk() #ウインドウのサイズを設定 gamen.geometry('880x560') #ウインドウのタイトルを設定 gamen.title('クリちゃんBOT 初期バージョン') #フォントの用意 font = ('創英角ポップ体', 14) font_log = ('創英角ポップ体',11) #メニューバーの作成 menubar = tk.Menu(gamen) gamen.config(menu = menubar) #ファイルメニュー filemenu = tk.Menu(menubar) menubar.add_cascade(label = '会話',menu = filemenu) filemenu.add_command(label = '会話を終える', command = gamen.destroy) #オプションメニュー action = tk.IntVar() optionmenu = tk.Menu(menubar) menubar.add_cascade(label = 'タイプオプション',menu = optionmenu) optionmenu.add_radiobutton( label = 'タイプ名を表示する', #アイテム名 variable = action, #選択時の値を格納するオブジェクト value = 0 #actionの値を0にする ) optionmenu.add_radiobutton( label = 'タイプ名を表示しない', #アイテム名 variable = action, #選択時の値を格納するオブジェクト value = 1 #actionの値を0にする ) #キャンバスの作成 canvas = tk.Canvas( gamen, #親要素をメインウインドウに設定 width = 500, #幅を設定 height = 300, #高さを設定 relief = tk.RIDGE, #枠線を表示 bd = 2, bg = 'aquamarine' #枠線の幅を設定 ) canvas.place(x = 370, y = 0) img = tk.PhotoImage(file = 'kurichan.gif') #表示するイメージを用意 canvas.create_image( #キャンバス上にイメージを配置 160, #x座標 60, image = img, #配置するイメージオブジェクトを指定 anchor = tk.NW #配置の起点となる位置を左上隅に指定 ) #応答エリアを作成 response_area = tk.Label( gamen, #親要素をメインウインドウに設定 width = 50, #幅を設定 height = 10, #高さを設定 bg = 'orange', #背景色を設定 font = font, fg = 'blue' , #フォントを設定 relief = tk.RIDGE , #枠線の種類を指定 bd = 2 #枠線の幅を設定 ) response_area.place(x = 370, y = 305) #メインウインドウに配置 #フレームの作成 frame = tk.Frame( gamen, #親要素はウインドウ relief = tk.RIDGE, #ボーダーの種類 borderwidth = 4 #ボーダー幅を設定 ) #入力ボックスの作成 entry = tk.Entry( frame, #親要素はフレーム width = 70, #幅を設定 font = font, fg = 'green', bg = 'yellow' #フォントを設定 ) entry.pack(side = tk.LEFT) #フレームに左詰めで配置する entry.focus_set() #入力ボックスにフォーカスを当てる #ボタンの作成 button = tk.Button( frame, #親要素はフレーム width = 15, #幅を設定 text = '話す', bg = 'blue', fg = 'gold', #ボタンに表示するテキスト command = talk #クリック時にtalk()関数を呼ぶ ) button.pack(side = tk.LEFT) #フレームに左詰めで配置する frame.place(x = 30, y = 520) #フレームを画面上に配置 #リストボックスを作成 lb = tk.Listbox( gamen, #親要素はメインウインドウ width = 42, #幅を設定 height = 30, #高さを設定 font = font_log, bg = 'green', fg ='pink' #フォントを設定 ) #縦のスクロールバーを生成 sb1 = tk.Scrollbar( gamen, #親要素はメインウインドウ orient = tk.VERTICAL, #縦方向のスクロールバーにする command = lb.yview #スクロール時にListboxのyview()メソッドを呼ぶ ) #横のスクロールバーを生成 sb2 = tk.Scrollbar( gamen, #親要素はメインウインドウ orient = tk.HORIZONTAL, #横方向のスクロールバーにする command = lb.xview #スクロール時にListboxのxview()メソッドを呼ぶ ) #リストボックスとスクロールバーを連動させる lb.configure(yscrollcommand = sb1.set) lb.configure(xscrollcommand = sb2.set) #grid()でリストボックス、スクロールバーを画面上に配置 lb.grid(row = 0, column = 0) sb1.grid(row = 0, column = 1, sticky = tk.NS) sb2.grid(row = 1, column = 0,sticky = tk.EW) #メインループ gamen.mainloop() #--------------------------------------------------------------------- #プログラムの起点 #--------------------------------------------------------------------- if __name__ == '__main__': run()