Python学習15日目(5/21)まいにちゲームづくり7日目 グリコゲームGUI画面遷移
一日空いちゃいましたが続けていきます。
イメージは立っていたんですけど、classとself周りがちょっと苦手だったり、就活疲れでやらなくなっちゃってましたね…
リフレッシュこそ頑張っていたもののリフレッシュに時間を使いすぎず、目的と手段を考えつつ無理ない範囲で今後とも継続して作っていきたいです。
さて本題です。
今日は画面遷移をさせたいと思っています。
早速コードです。
# -*- coding: utf-8 -*-
import tkinter as tk
import PIL.Image, PIL.ImageTk
from tkinter import font
import random
from tkinter import messagebox
class App(tk.Tk):
jibun_count =0
aite_count =0
# 呪文
def __init__(self, *args, **kwargs):
# 呪文
tk.Tk.__init__(self, *args, **kwargs)
# ウィンドウタイトルを決定
self.title("Tkinter change page")
# ウィンドウの大きさを決定
self.geometry("800x600")
# ウィンドウのグリッドを 1x1 にする
# この処理をコメントアウトすると配置がズレる
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
#-----------------------------------main_frame-----------------------------
# メインページフレーム作成
self.main_frame = tk.Frame()
self.main_frame.grid(row=0, column=0, sticky="nsew")
# タイトルラベル作成
self.titleLabel = tk.Label(self.main_frame, text="Main Page", font=('Helvetica', '35'))
self.titleLabel.pack(anchor='center', expand=True)
# フレーム1に移動するボタン
self.changePageButton = tk.Button(self.main_frame, text="Go to frame1", command=lambda : self.changePage(self.frame1))
self.changePageButton.pack()
#--------------------------------------------------------------------------
#-----------------------------------frame1---------------------------------
# 移動先フレーム作成
self.frame1 = tk.Frame()
self.frame1.grid(row=0, column=0, sticky="nsew")
# タイトルラベル作成
self.titleLabel = tk.Label(self.frame1, text="Frame 1", font=('Helvetica', '35'))
self.titleLabel.pack(anchor='center', expand=True)
# フレーム1からmainフレームに戻るボタン
self.back_button = tk.Button(self.frame1, text="Back", command=lambda : self.changePage(self.main_frame))
self.back_button.pack()
#とりあえず動かすベース!packとplace入り混じっているけど動き分かるようにすることが優先
self.btn_g = tk.Button(self.frame1, text='グー', command = lambda:self.janken("グー"))
self.btn_g.place(x=50, y=50)
self.btn_c = tk.Button(self.frame1, text='チョキ', command = lambda:self.janken("チョキ"))
self.btn_c.place(x=100, y=50)
self.btn_p = tk.Button(self.frame1, text='パー', command = lambda:self.janken("パー"))
self.btn_p.place(x=150, y=50)
self.txt_jibun = tk.Entry(self.frame1)
self.txt_jibun.place(x=50, y=100)
self.txt_aite = tk.Entry(self.frame1)
self.txt_aite.place(x=50, y=120)
self.txt_result = tk.Entry(self.frame1)
self.txt_result.place(x=250, y=50)
self.font2 = font.Font(family='Times', size=40)
self.text_jibun = tk.StringVar()
self.text_jibun.set("自分:あと30マス")
self.label_jibun = tk.Label(self.frame1,textvariable=self.text_jibun,font=self.font2)
self.label_jibun.place(x=50, y=150)
self.text_aite = tk.StringVar()
self.text_aite.set("相手:あと30マス")
self.label_aite = tk.Label(self.frame1,textvariable=self.text_aite,font=self.font2)
self.label_aite.place(x=50, y=400)
self.btn_end = tk.Button(self.frame1, text='終了',command = self.quit)
self.btn_end.place(x=300, y=350)
#--------------------------------------------------------------------------
#main_frameを一番上に表示
self.main_frame.tkraise()
def changePage(self, page):
'''
画面遷移用の関数
'''
page.tkraise()
def janken(self,choice):
if App.jibun_count >=30 or App.aite_count>=30:
return
jyanken_list = ["グー","チョキ","パー"]
random_choice = jyanken_list[random.randrange(3)]
if choice =="グー"and random_choice =="パー":
App.aite_count +=6
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"相手の勝ち")
elif choice =="チョキ"and random_choice =="グー":
App.aite_count +=3
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"相手の勝ち")
elif choice =="パー"and random_choice =="チョキ":
App.aite_count +=5
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"相手の勝ち")
elif random_choice =="グー"and choice =="パー":
App.jibun_count +=6
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"自分の勝ち")
elif random_choice =="チョキ"and choice =="グー":
App.jibun_count +=3
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"自分の勝ち")
elif random_choice =="パー"and choice =="チョキ":
App.jibun_count +=5
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"自分の勝ち")
if choice == random_choice:
self.txt_result.delete(0, tk.END)
self.txt_result.insert(tk.END,"あいこ!")
else:
self.txt_jibun.delete(0, tk.END)
self.txt_aite.delete(0, tk.END)
if App.jibun_count >=30:
messagebox.showinfo("おめでとう!","自分の勝ち!")
self.txt_jibun.insert(tk.END,"自分:"+30*"○"+"□")
self.txt_aite.insert(tk.END,"相手"+App.aite_count*"○"+"■"+(30-App.aite_count)*"○")
self.text_jibun.set("自分:あと0マス")
self.text_aite.set(("相手:あと"+str(30-App.aite_count)+"マス"))
elif App.aite_count >=30:
messagebox.showinfo("残念!","相手の勝ち")
self.txt_jibun.insert(tk.END,"自分:"+App.jibun_count*"○"+"□"+(30-App.jibun_count)*"○")
self.txt_aite.insert(tk.END,"相手"+30*"○"+"■")
self.text_jibun.set("自分:あと"+str(30-App.jibun_count)+"マス")
self.text_aite.set(("相手:あと0マス"))
else:
self.txt_jibun.insert(tk.END,"自分:"+App.jibun_count*"○"+"□"+(30-App.jibun_count)*"○")
self.txt_aite.insert(tk.END,"相手"+App.aite_count*"○"+"■"+(30-App.aite_count)*"○")
self.text_jibun.set("自分:あと"+str(30-App.jibun_count)+"マス")
self.text_aite.set(("相手:あと"+str(30-App.aite_count)+"マス"))
def quit(self):
self.destroy()
if __name__ == "__main__":
app = App()
app.mainloop()
実装したいこと
UI周り
画面遷移させる
プログラム設計
クラス分けする
プログラム内容
残りマスが0を超えてマイナスになってしまっていたので、マイナスにならないようにする
やってみて困ったことと解決策
・画面遷移のやり方がわからない
https://qiita.com/seisantaro/items/74ed83fec3d126553245
を読んで解決
このサイトで使っているコードに、自分が組んだコードを加えてきます。
・クラス周りがわからない
https://snowtree-injune.com/2019/02/11/python-class-necessity/
以前困った時に解決したサイト 読んでは居ないけどこれを読めば流れに沿って組み立てているので良くわかる
・selfをいつ、どこに書いたらいいかわからない
https://www.sejuku.net/blog/64106
を読んで把握 クラス周りがわからないのほうを読んでも良い
・宣言をtkinterとするかtkとするかで表記を統一する必要がある
・表示させる方法としてgridとpackがあるが、packの使い方がいまいちわからない
https://pg-chain.com/python-pack-grid-place
を読んで把握
とりあえずgridとpack入り混じっているけど動かすことベースなので保留に
・画面に表示させる時に使うFlameやwidgetの用い方がわからない
https://www.shido.info/py/tkinter2.html
を読んで把握
・グローバル変数が上手く使えない
https://uxmilk.jp/41600
https://qiita.com/msssgur/items/12992fc816e6adf32cff
を読んで把握
・destoryが上手く行かない
https://www.delftstack.com/ja/howto/python-tkinter/how-to-close-a-tkinter-window-with-a-button/
を読んで解決 別に関数を呼び出した
・マス目の初期値の設定方法がわからない
https://qiita.com/kotakahe/items/e0aa41a08b31e91405b9
を読んで解決 class名.変数名とすれば良いとわかった(今回だとApp.jibun_count)
実行画面
解決策の立て方
該当する問題を考えて言語化する
該当する問題に類似している結果が出そうなワードで検索する
とりあえず1行ずつ試しに実行してエラーが出たらちゃんと見る
おわりに
一通り動いたので安心しました。
勝った時に進むマス目を前の画面で選べるようにしようと思っているんですが、今日は画面遷移でいっぱいいっぱいだったので明日することにします。
こんな感じで、その日のうちに次の日することを考えておくと良さそうですね。
それではまた~
この記事が気に入ったらサポートをしてみませんか?