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

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

ただいまの
回答率

90.76%

  • Python

    6871questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 128

k.keigo

score 28

該当のソースコード:

import sys
import pygame
from pygame.locals import QUIT, MOUSEBUTTONDOWN

pygame.init()
window = pygame.display.set_mode((300, 400))
pygame.display.set_caption("計算機")


def main():
    font = pygame.font.SysFont(None, 75)
    a = font.render("1", True, (255, 255, 255))
    b = font.render("2", True, (255, 255, 255))
    c = font.render("3", True, (255, 255, 255))
    d = font.render("+", True, (255, 255, 255))
    e = font.render("4", True, (255, 255, 255))
    f = font.render("5", True, (255, 255, 255))
    g = font.render("6", True, (255, 255, 255))
    h = font.render("-", True, (255, 255, 255))
    i = font.render("7", True, (255, 255, 255))
    j = font.render("8", True, (255, 255, 255))
    k = font.render("9", True, (255, 255, 255))
    l = font.render("×", True, (255, 255, 255))
    m = font.render("0", True, (255, 255, 255))
    n = font.render("00", True, (255, 255, 255))
    o = font.render("=", True, (255, 255, 255))
    p = font.render("÷", True, (255, 255, 255))

    a_rect = a.get_rect()
    b_rect = b.get_rect()
    c_rect = c.get_rect()
    d_rect = d.get_rect()
    e_rect = e.get_rect()
    f_rect = f.get_rect()
    g_rect = g.get_rect()
    h_rect = h.get_rect()
    i_rect = i.get_rect()
    j_rect = j.get_rect()
    k_rect = k.get_rect()
    l_rect = l.get_rect()
    m_rect = m.get_rect()
    n_rect = n.get_rect()
    o_rect = o.get_rect()
    p_rect = p.get_rect()

    a_rect.center = (0 + 37, 100 + 37)
    b_rect.center = (75 + 37, 100 + 37)
    c_rect.center = (150 + 37, 100 + 37)
    d_rect.center = (225 + 37, 100 + 37)
    e_rect.center = (0 + 37, 175 + 37)
    f_rect.center = (75 + 37, 175 + 37)
    g_rect.center = (150 + 37, 175 + 37)
    h_rect.center = (225 + 37, 175 + 37)
    i_rect.center = (0 + 37, 250 + 37)
    j_rect.center = (75 + 37, 250 + 37)
    k_rect.center = (150 + 37, 250 + 37)
    l_rect.center = (225 + 37, 250 + 37)
    m_rect.center = (0 + 37, 325 + 37)
    n_rect.center = (75 + 37, 325 + 37)
    o_rect.center = (150 + 37, 325 + 37)
    p_rect.center = (225 + 37, 325 + 37)
    mousepos = []
    kekka = []

    while True:
        window.fill((0, 0, 0))
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                mousepos.append(event.pos)

        for lenx in range(0, 300, 75):
            pygame.draw.line(window, (255, 255, 255), (lenx - 1, 100), (lenx, 400))
        for leny in range(100, 400, 75):
            pygame.draw.line(window, (255, 255, 255), (0, leny), (300, leny))

        window.blit(a, a_rect)
        window.blit(b, b_rect)
        window.blit(c, c_rect)
        window.blit(d, d_rect)
        window.blit(e, e_rect)
        window.blit(f, f_rect)
        window.blit(g, g_rect)
        window.blit(h, h_rect)
        window.blit(i, i_rect)
        window.blit(j, j_rect)
        window.blit(k, k_rect)
        window.blit(l, l_rect)
        window.blit(m, m_rect)
        window.blit(n, n_rect)
        window.blit(o, o_rect)
        window.blit(p, p_rect)  #

        for x, y in mousepos:
            if 0 <= x <= 75 and 100 <= y <= 175:
                kekka.append('1')
            elif 75 <= x <= 150 and 100 <= y <= 175:
                kekka.append('2')
            elif 150 <= x <= 225 and 100 <= y <= 175:
                kekka.append('3')
            elif 0 <= x <= 75 and 175 <= y <= 250:
                kekka.append('4')
            elif 75 <= x <= 150 and 175 <= y <= 250:
                kekka.append('5')
            elif 150 <= x <= 225 and 175 <= y <= 250:
                kekka.append('6')
            elif 0 <= x <= 75 and 250 <= y <= 325:
                kekka.append('7')
            elif 75 <= x <= 150 and 250 <= y <= 325:
                kekka.append('8')
            elif 150 <= x <= 225 and 250 <= y <= 325:
                kekka.append('9')
            elif 0 <= x <= 75 and 325 <= y <= 400:
                kekka.append('0')
            elif 75 <= x <= 150 and 325 <= y <= 400:
                kekka.append('00')
        q=""
        for kekkaretu in kekka:
            q+=kekkaretu
            kekkamessage = font.render(q, True, (255, 255, 255))
            kekkamessage_rect=kekkamessage.get_rect()
            kekkamessage_rect.bottomright=(300,100)
            window.blit(kekkamessage,kekkamessage_rect)

        pygame.display.update()


if __name__ == '__main__':
    main()


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

q=""
for kekkaretu in kekka:
            q+=kekkaretu
            kekkamessage = font.render(q, True, (255, 255, 255))
            kekkamessage_rect=kekkamessage.get_rect()
            kekkamessage_rect.bottomright=(300,100)
            window.blit(kekkamessage,kekkamessage_rect)


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

やってみたこと2:

q=""
for kekkaretu in kekka:
            q+=kekkaretu
            kekkamessage = font.render(q, True, (255, 255, 255))
            kekkamessage_rect=kekkamessage.get_rect()
            kekkamessage_rect.bottomright=(300,100)
            window.blit(kekkamessage,kekkamessage_rect)


この後ろに

if len(q)==1:
        break


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/04/29 17:51

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

    キャンセル

  • k.keigo

    2018/04/29 17:52

    はい

    キャンセル

回答 2

checkベストアンサー

+2

原因

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

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


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

オマケ

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

デバッグについて

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 19:06

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

    キャンセル

  • 2018/04/29 19:10

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

    キャンセル

  • 2018/04/29 19:54

    はい

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 17:56

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6871questions

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