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

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

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

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

Q&A

解決済

2回答

1629閲覧

クリックした数字を電卓のように増やしたいのですが、うまくいきません。

cand

総合スコア65

Python

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

0グッド

0クリップ

投稿2018/04/29 08:33

該当のソースコード:

python

1import sys 2import pygame 3from pygame.locals import QUIT, MOUSEBUTTONDOWN 4 5pygame.init() 6window = pygame.display.set_mode((300, 400)) 7pygame.display.set_caption("計算機") 8 9 10def main(): 11 font = pygame.font.SysFont(None, 75) 12 a = font.render("1", True, (255, 255, 255)) 13 b = font.render("2", True, (255, 255, 255)) 14 c = font.render("3", True, (255, 255, 255)) 15 d = font.render("+", True, (255, 255, 255)) 16 e = font.render("4", True, (255, 255, 255)) 17 f = font.render("5", True, (255, 255, 255)) 18 g = font.render("6", True, (255, 255, 255)) 19 h = font.render("-", True, (255, 255, 255)) 20 i = font.render("7", True, (255, 255, 255)) 21 j = font.render("8", True, (255, 255, 255)) 22 k = font.render("9", True, (255, 255, 255)) 23 l = font.render("×", True, (255, 255, 255)) 24 m = font.render("0", True, (255, 255, 255)) 25 n = font.render("00", True, (255, 255, 255)) 26 o = font.render("=", True, (255, 255, 255)) 27 p = font.render("÷", True, (255, 255, 255)) 28 29 a_rect = a.get_rect() 30 b_rect = b.get_rect() 31 c_rect = c.get_rect() 32 d_rect = d.get_rect() 33 e_rect = e.get_rect() 34 f_rect = f.get_rect() 35 g_rect = g.get_rect() 36 h_rect = h.get_rect() 37 i_rect = i.get_rect() 38 j_rect = j.get_rect() 39 k_rect = k.get_rect() 40 l_rect = l.get_rect() 41 m_rect = m.get_rect() 42 n_rect = n.get_rect() 43 o_rect = o.get_rect() 44 p_rect = p.get_rect() 45 46 a_rect.center = (0 + 37, 100 + 37) 47 b_rect.center = (75 + 37, 100 + 37) 48 c_rect.center = (150 + 37, 100 + 37) 49 d_rect.center = (225 + 37, 100 + 37) 50 e_rect.center = (0 + 37, 175 + 37) 51 f_rect.center = (75 + 37, 175 + 37) 52 g_rect.center = (150 + 37, 175 + 37) 53 h_rect.center = (225 + 37, 175 + 37) 54 i_rect.center = (0 + 37, 250 + 37) 55 j_rect.center = (75 + 37, 250 + 37) 56 k_rect.center = (150 + 37, 250 + 37) 57 l_rect.center = (225 + 37, 250 + 37) 58 m_rect.center = (0 + 37, 325 + 37) 59 n_rect.center = (75 + 37, 325 + 37) 60 o_rect.center = (150 + 37, 325 + 37) 61 p_rect.center = (225 + 37, 325 + 37) 62 mousepos = [] 63 kekka = [] 64 65 while True: 66 window.fill((0, 0, 0)) 67 for event in pygame.event.get(): 68 if event.type == QUIT: 69 pygame.quit() 70 sys.exit() 71 elif event.type == MOUSEBUTTONDOWN: 72 mousepos.append(event.pos) 73 74 for lenx in range(0, 300, 75): 75 pygame.draw.line(window, (255, 255, 255), (lenx - 1, 100), (lenx, 400)) 76 for leny in range(100, 400, 75): 77 pygame.draw.line(window, (255, 255, 255), (0, leny), (300, leny)) 78 79 window.blit(a, a_rect) 80 window.blit(b, b_rect) 81 window.blit(c, c_rect) 82 window.blit(d, d_rect) 83 window.blit(e, e_rect) 84 window.blit(f, f_rect) 85 window.blit(g, g_rect) 86 window.blit(h, h_rect) 87 window.blit(i, i_rect) 88 window.blit(j, j_rect) 89 window.blit(k, k_rect) 90 window.blit(l, l_rect) 91 window.blit(m, m_rect) 92 window.blit(n, n_rect) 93 window.blit(o, o_rect) 94 window.blit(p, p_rect) # 95 96 for x, y in mousepos: 97 if 0 <= x <= 75 and 100 <= y <= 175: 98 kekka.append('1') 99 elif 75 <= x <= 150 and 100 <= y <= 175: 100 kekka.append('2') 101 elif 150 <= x <= 225 and 100 <= y <= 175: 102 kekka.append('3') 103 elif 0 <= x <= 75 and 175 <= y <= 250: 104 kekka.append('4') 105 elif 75 <= x <= 150 and 175 <= y <= 250: 106 kekka.append('5') 107 elif 150 <= x <= 225 and 175 <= y <= 250: 108 kekka.append('6') 109 elif 0 <= x <= 75 and 250 <= y <= 325: 110 kekka.append('7') 111 elif 75 <= x <= 150 and 250 <= y <= 325: 112 kekka.append('8') 113 elif 150 <= x <= 225 and 250 <= y <= 325: 114 kekka.append('9') 115 elif 0 <= x <= 75 and 325 <= y <= 400: 116 kekka.append('0') 117 elif 75 <= x <= 150 and 325 <= y <= 400: 118 kekka.append('00') 119 q="" 120 for kekkaretu in kekka: 121 q+=kekkaretu 122 kekkamessage = font.render(q, True, (255, 255, 255)) 123 kekkamessage_rect=kekkamessage.get_rect() 124 kekkamessage_rect.bottomright=(300,100) 125 window.blit(kekkamessage,kekkamessage_rect) 126 127 pygame.display.update() 128 129 130if __name__ == '__main__': 131 main()

やりたいこと:画面に表示された数字を押すとその数字が計算機のように表示されるようにしたいです
エラー:エラーではないのですが、同じ数字が永遠に表示されます
やってみたこと1:該当の箇所

python

1q="" 2for kekkaretu in kekka: 3 q+=kekkaretu 4 kekkamessage = font.render(q, True, (255, 255, 255)) 5 kekkamessage_rect=kekkamessage.get_rect() 6 kekkamessage_rect.bottomright=(300,100) 7 window.blit(kekkamessage,kekkamessage_rect) 8

をwhile分の外に出してみました
結果:何も表示されなかったです

やってみたこと2:

python

1q="" 2for kekkaretu in kekka: 3 q+=kekkaretu 4 kekkamessage = font.render(q, True, (255, 255, 255)) 5 kekkamessage_rect=kekkamessage.get_rect() 6 kekkamessage_rect.bottomright=(300,100) 7 window.blit(kekkamessage,kekkamessage_rect)

この後ろに

python

1if len(q)==1: 2 break

を入れてみました
結果:1回目のクリックでは数字一つだけ表示されるのですが、2回目はひょうじされませんでした。

どなたかクリックした数字が電卓のように増えていくようなアルゴリズムを教えてください。

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

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

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

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

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

LouiS0616

2018/04/29 08:51

まだオリジナルのコードを書ける段階にないと思います。書いていてコードの意味は分かっているのでしょうか?
cand

2018/04/29 08:52

はい
guest

回答2

0

ベストアンサー

###原因

ボタンが押された時マウスの位置をmouseposへ追加してそのあとその位置のボタンがどれかを判定するループに入ってますが、mouseposを消してません。それが'1'を一回しかクリックしていないのに表示が"11111..."となる原因です。

python

1 mousepos = [] # この行を追加 2 q = "" 3 for kekkaretu in kekka: 4 q += kekkaretu

上に示した****の行を挿入すると期待通りに1回につき一けただけの数字が追加されるようになります。

###オマケ

しかし・・・やってみるとわかりますが、まだまだバグがあります。
例えば、"1"を押した後"2"を押すと表示がくずれますね。描画直前に「以前の状態を消す」ということを忘れてるようです。

###デバッグについて

プログラムを動かそうとするなら「デバッグ」をしてください。ソースを眺めてあて推量であれこれ変えてみてもプログラムが期待通りに動くことは決してないです。「なぜ期待通りにならないかの原因」をデバッグによって掴んだ事実(例えば変数の値とか、コードのどこを通過したとかの事実)によりつきとめ、その上で「どうなおすべきか」を考えてください。

基本的なテクニックは「print文を入れまくって、変数の値が期待通りかを調べていく」ことです。

投稿2018/04/29 09:13

KSwordOfHaste

総合スコア18392

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

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

cand

2018/04/29 10:06

うまくいきました。ありがとうございました。
KSwordOfHaste

2018/04/29 10:10

デバッグしてくださいというのが一番伝えたかったことです。こちらをお忘れなくです。
cand

2018/04/29 10:54

はい
guest

0

前の数字、を覚えておいて、
前の数字*10+今回の数字 を計算して出せばOK

投稿2018/04/29 08:52

y_waiwai

総合スコア87719

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

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

cand

2018/04/29 08:56

確かにそうですね。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問