

Pythonを「pythonゲームプログラミング 知っておきたい数学と物理の基本」にて勉強中の超初心者です。  
標題の本（教科書）に記載に従って、下記のコードを入力し、「Run Module」にて実行したところ、エラーメッセージが表示され、「pygame
window」と表示された、真黒な画面が表示され、しばらく待ちましたが、変化はありませんでした。  
「SURFACE(.......)」、「main()」等の、入力位置を前後に移動してみましたが、同様のエラーメッセージが表示され、画面も同様に、真黒でした。教科書に記載されたような画面が表示されるようにするには、何が不足しているのでしょうか。  
「class Slider」をインストールする必要があるのでしょうか。ご指導のほど、よろしくお願い申し上げます。

**エラーメッセージ抜粋**

[code]

    Traceback (most recent call last):
      File "C:\Users\User\Documents\trg_function0.py", line 83, in <module>
        main()
      File "C:\Users\User\Documents\trg_function0.py", line 41, in main
        slider = Slider(Rect(20, 410, 360, 35), 0, 360, 0)
    TypeError: Slider() takes no arguments
    
[/code]

**入力したコード**  
trg_function0.py

[code]

    import sys
    from math import sin, cos, radians
    import pygame
    from pygame.locals import Rect,QUIT, MOUSEMOTION, MOUSEBUTTONDOWN, MOUSEBUTTONUP
    
    pygame.init()
    SURFACE = pygame.display.set_mode((400, 450))
    FPSCLOCK = pygame.time.Clock()
    class Slider:
        "スライダウィジェット"
    
    def __init__(self, rect, min_value, max_value, value):
        self.rect = rect
        self.slider_rect = rect.copy()
        self.slider_rect.inflate_ip(-20, -20)
        self.knob_rect = rect.copy()
        self.knob_rect.move_ip(10, 0)
        self.knob_rect.width = 4
        self.min_value = min_value
        self.max_value = max_value
        self.value = value
        def draw(self):
             """ スライダを描画 """
        pygame.draw.rect(SURFACE, (225, 225, 225), self.rect)
        pygame.draw.rect(SURFACE, (64, 64, 128), self.slider_rect)
        pygame.draw.rect(SURFACE, (0, 0, 255), self.knob_rect)
        def set_pos(self, xpos):
            """ スライダ値を設定 """
            xpos = max(self.slider_rect.left, min(self.slider_rect.right, xpos))
            ypos = self.knob_rect.center[1]
            self.knob_rect.center = (xpos, ypos)
        def get_value(self):
            """ スライダ値を取得 """
            ratio = (self.knob_rect.center[0] - self.slider_rect.left) / self.slider_rect.width
            return(self.max_value - self.min_value) * ratio + self.min_value
    
    def main():
        """ main routine """
        sysfont = pygame.font.SysFont(None, 24)
        slider = Slider(Rect(20, 410, 360, 35), 0, 360, 0)
        mouse_down = false
    
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == MOUSEMOTION:
                    if mouse_down and slider.rect.collidepoint(event.pos):
                            slider.set_pos(event.pos[0])
                    elif event.type == MOUSEBUTTONDOWN:
                            mouse_down = True
                elif event.type == MOUSEBUTTONUP:
                        mouse_down = false
            SURFACE.fill((255, 255, 255))
            slider.draw()
            for index in range(0, 400, 10):
                pygame.draw.line(SURFACE, (225, 225, 225), (0, index), (400, index))
                pygame.draw.line(SURFACE, (225, 225, 225), (index, 0), (index, 400))
                pygame.draw.line(SURFACE, (0, 0, 0), (0, 200), (400, 200))
                pygame.draw.line(SURFACE, (0, 0, 0), (200, 0), (200, 400))
                pygame.draw.circle(SURFACE, (255, 0, 0), (200, 200), (150, 2))
    
            theta = slider.get_value()
            cos_v = round(cos(radians(theta)), 3)
            sin_v = round(sin(radians(theta)), 3)
            xpos = cos_v * 150 + 200
            ypos = sin_v * -150 + 200
    
            pygame.draw.line(SURFACE, (0, 0, 192), (xpos, ypos), (xpos, 200))
            pygame.draw.line(SURFACE, (0, 192, 0), (xpos, ypos), (200, ypos))
            pygame.draw.line(SURFACE, (192, 0, 0), (xpos, ypos), (200, 200))
            bmp = sysfont.render("cos:{}".format(cos_v), True, (0, 0, 192))
            SURFACE.blit(bmp, (xpos, 200))
            bmp = sysfont.render("sin:{}".format(sin_v), True, (0, 192, 0))
            SURFACE.blit(bmp, (200, ypos))
    
            pygame.display.update()
            FPSCLOCK.tick(10)
    
    if __name__ == '__main__':
        main()
    
[/code]


CC BY-SA 4.0
2020-03-27T12:08:19.957
64156
2020-03-28T01:45:34.770
2020-03-27T12:20:29.170
3060
38384
question
python pygame
python のpygameプログラムで、class Slider の命令が認識されません。


検索したら、該当書籍の該当部分が出てきたので見てみたら、まあ入力ミスですね。  
質問記事のソースは書籍の記述と違っているので、以下を直してください。

  * `class Slider:`の`def __init__(...):`メソッド全体のインデントを増やす
  * `class Slider:`の`def draw(self):`メソッドの`pygame.draw.rect()`のインデントを増やす
  * `def main():`の2か所の`mouse_down = false`の`false`は`False`と大文字で始める
  * `def main():`の最初の`for`ループで`elif event.type == MOUSEBUTTONDOWN:`と`mouse_down = True`のインデントを減らす
  * `def main():`の2つ目の`for`ループに含まれるのは2行の`pygame.draw.line()`だけ、その下の`pygame.draw.line()`と`pygame.draw.circle()`は`for`ループの外側へ(インデントを減らす)
  * `def main():`の`pygame.draw.circle()`の後ろ2つのパラメータ`, (150, 2))`が余分な括弧に囲まれていたのを外して`, 150, 2)`にする

おまけ(見映えのため)

  * `class Slider:`の`def draw(self):`,`def set_pos(self, xpos):`,`def get_value(self):`の前に空白行を挿入する

内容は書籍の記述そのものなので、全体の修正版記述は止めます。

書籍の該当部分の最後に以下の記述がありますが、プログラミングの勉強では「入力/転記ミス」に注意してください。

>
> 今の段階ではプログラムの内容を理解できなくても構いません。ただ、プログラムを入力・実行して、中心角とsin/cosの関係がどうなっているかしっかりと把握してください。


CC BY-SA 4.0
2020-03-27T12:53:01.393
64158
2020-03-28T01:45:34.770
2020-03-28T01:45:34.770
26370
26370
64156
answer