質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

993閲覧

pygameで製作したタイマーが、応答なしになる

shiratuyu

総合スコア1

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/08 04:01

前提・実現したいこと

Pythonのpygameを利用して、カウントダウンタイマーを作っています。
システムの流れは下記の通りです
(1)初期画面に3分、6分のボタンがある(カーソルを合わせるとボタンの色が変わる仕様)
(2)いずれかのボタンをクリックするとカウントダウンが始まる
(3)カウントダウンが終わると「終了」という表示がでる
※背景画像の上にキャラクター+フキダシ画像を置き、更にそのフキダシの上に文字やボタンを置いています

起動して放置しておけば最後まで作動するのですが、
(2)のカウントダウン中に、ウィンドウ内外関係なくどこかをクリックすると停止し、応答なしとなってしまいます。

Pythonの基本を終えたばかりで原因もよくわからず、昨日1日中いろいろ試してみましたが自力では解決できませんでした。
どうかお知恵を貸していただけると助かります、よろしくお願いします。

該当のソースコード

Python

1import pygame 2import sys 3 4GLAY = (171, 171, 171) #文字色 5 6def main(): 7 pygame.init() 8 pygame.display.set_caption('タイマー') 9 clock = pygame.time.Clock() 10 screen = pygame.display.set_mode((800, 600)) 11 font = pygame.font.Font('APJapanesefontT.ttf', 35) 12 13 frag = 0 #フラグ管理 14 15 img_bg = pygame.image.load('bg.png') #背景画像 16 img_1 = pygame.image.load('hukidashi_1.png') #フキダシ画像1(初期画面、カウントダウン時) 17 img_2 = pygame.image.load('hukidashi_2.png') #フキダシ画像2(完成時) 18 button_off = pygame.image.load('button_off.png') #ボタン 19 button_on = pygame.image.load('button_on.png') #ボタン(カーソルを合わせた時) 20 21 while True: 22 for event in pygame.event.get(): 23 if event.type == pygame.QUIT: 24 pygame.quit() 25 sys.exit() 26 27 #<0> 初期画面 28 if frag == 0: 29 screen.blit(img_bg, [0, 0]) #画像 30 screen.blit(img_1, [0, 0]) 31 screen.blit(button_off, [100, 220]) 32 screen.blit(button_off, [240, 220]) 33 34 txt_Q = font.render('時間は?', True, GLAY) #テキスト 35 txt_3 = font.render('3分', True, GLAY) 36 txt_6 = font.render('6分', True, GLAY) 37 screen.blit(txt_Q, [117, 160]) 38 screen.blit(txt_3, [130, 248]) 39 screen.blit(txt_6, [270, 248]) 40 41 mouseX, mouseY = pygame.mouse.get_pos() #マウス座標、クリック判定 42 click, a, b = pygame.mouse.get_pressed() 43 44 #3分を選択した時 45 if (110 <= mouseX <= 220) and (230 <= mouseY <= 300): 46 screen.blit(button_on, [100, 220]) 47 screen.blit(txt_3, [130, 248]) 48 if click == 1: 49 frag = 1 50 51 #6分を選択した時 52 if (250 <= mouseX <= 360) and (210 <= mouseY <= 280): 53 screen.blit(button_on, [240, 220]) 54 screen.blit(txt_6, [270, 248]) 55 if click == 1: 56 frag = 2 57 58 pygame.display.update() 59 clock.tick(10) 60 61 #<1> カウントダウン(3分) 62 if frag == 1: 63 minute = 3 64 second = 0 65 loop = True 66 67 while loop: 68 for num in range(59, -1, -1): 69 if (minute == 0) and (second == 0): 70 frag = 3 71 loop = False 72 break 73 74 if second == 0: #カウント 75 minute -= 1 76 second = num 77 78 screen.blit(img_bg, [0, 0]) #画像 79 screen.blit(img_1, [0, 0]) 80 81 if 0 <= second < 10: #テキスト 82 txt_0 = font.render('残り{}分0{}秒'.format(minute, second), True, GLAY) 83 screen.blit(txt_0, [105, 200]) 84 else: 85 txt_10 = font.render('残り{}分{}秒'.format(minute, second), True, GLAY) 86 screen.blit(txt_10, [105, 200]) 87 88 pygame. display.update() 89 clock.tick(1) 90 91 #<2> カウントダウン(6分) 92 if frag == 2: 93 minute = 6 94 second = 0 95 loop = True 96 97 while loop: 98 for num in range(59, -1, -1): 99 if (minute == 0) and (second == 0): 100 frag = 3 101 loop = False 102 break 103 104 if second == 0: #カウント 105 minute -= 1 106 second = num 107 108 screen.blit(img_bg, [0, 0]) #画像 109 screen.blit(img_1, [0, 0]) 110 111 if 0 <= second < 10: #テキスト 112 txt_0 = font.render('残り{}分0{}秒'.format(minute, second), True, GLAY) 113 screen.blit(txt_0, [105, 200]) 114 else: 115 txt_10 = font.render('残り{}分{}秒'.format(minute, second), True, GLAY) 116 screen.blit(txt_10, [105, 200]) 117 118 pygame. display.update() 119 clock.tick(1) 120 121 #<3> 完成 122 if frag == 3: 123 screen.blit(img_bg, [0, 0]) #画像 124 screen.blit(img_2, [0, 0]) 125 126 txt = font.render('終了', True, GLAY) #テキスト 127 screen.blit(txt, [105, 200]) 128 129 pygame.display.update() 130 clock.tick(10) 131 132 133if __name__ == '__main__': 134 main() 135 136

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードに全角文字が含まれていてエラーになりました。

質問用に画像や外部ファイル等(画像ファイルや日本語フォント)
を取り除き、問題が再現する最低限のコードを作成できますか?

コピペのみで実行して、問題の現象が確認できるものが望ましいです。
(上記のコードを動かすには修正が必要で、修正が意図しない影響になることもあります)


原因については、カウントダウン内の while loop: 2か所。

イベント処理で pygame.event.get()がこのループの間呼ばれないので、
その間の GUI 操作などは意図しないものとなっているはずです。

解決策は set_timer を使い、pygame.event.get()
カウントのイベントを所得するように、構造自体の変更が必要です。

while True: イベント処理 if flag == 1: while loop: 3分間待つ <-- ここと if flag == 2: while loop: 6分間待つ <-- ここの実行の間、イベント処理が呼ばれない

set_timer を使ってイベントループ内で処理する。(コード断片のみ)

# タイマー用のイベントタイプを定義。(数値) # 他と被らないように、USEREVENT から連番で付けていきます。 TIMER_EVENT = pygame.USEREVENT+1 # タイマー開始。ボタンを押された時等、実際の開始は適切な位置で。 pygame.time.set_timer(TIMER_EVENT, 1000) while True: for event in pygame.event.get(): if event.type == TIMER_EVENT: # ここでカウントダウンを毎秒更新する処理

投稿2020/05/08 22:15

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiratuyu

2020/05/09 01:23

見辛かったのでコメントの位置を修正した際に、全角スペースを入れてしまっていました。お手間を取らせて申し訳ありません。 画像等のことも含め、以後気を付けます! また、原因と解決法を教えていただきありがとうございます!とても勉強になります。 お陰様で無事にタイマーを完成させることができました。お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問