代码之家  ›  专栏  ›  技术社区  ›  Mehmet Akif

为什么我不能点击滑块?

  •  0
  • Mehmet Akif  · 技术社区  · 1 年前

    我创建了一个pygame代码来模拟图灵模式。我想在模拟工作时添加滑块来更新变量,但它们根本不起作用。当我点击屏幕时,它会冻结并且没有响应。

    pygame.init()
    w_width = 600
    w_height = 600
    
    screen = pygame.display.set_mode([w_width, w_height])
    
    ra = 3
    ri = 5
    wa = 1
    wi = 0.2
    
    screen.fill((128, 128, 128))
    model = Model(rows,cols, ra, ri, wa, wi, 0.5)
    model.drawGrid(screen, w_width, w_height)
    
    slider_wa = Slider(screen, 40, 20, 50, 10, min=0, max=2, step=0.1)
    output_wa = TextBox(screen, 5, 10, 25, 25, fontSize=15)
    output_wa.disable()
    
    slider_wi = Slider(screen, 140, 20, 50, 10, min=0, max=2, step=0.1)
    output_wi = TextBox(screen, 105, 10, 25, 25, fontSize=15)
    output_wi.disable()  
    
    slider_ra = Slider(screen, 250, 20, 50, 10, min=0, max=10, step=0.5)
    output_ra = TextBox(screen, 215, 10, 25, 25, fontSize=15)
    output_ra.disable()
    
    slider_ri = Slider(screen, 360, 20, 50, 10, min=0, max=10, step=0.5)
    output_ri = TextBox(screen, 325, 10, 25, 25, fontSize=15)
    output_ri.disable()
    
    ra = slider_ra.getValue()
    ri = slider_ri.getValue()
    wa = slider_wa.getValue()
    wi = slider_wi.getValue()
        
    running = True
    
    time_delay = 100
    timer_event = pygame.USEREVENT + 1
    pygame.time.set_timer(timer_event, time_delay )
    
    win = pygame.display.set_mode([w_width, w_height])
    
    while running:
        for event in pygame.event.get():   
            if event.type == QUIT:
                running = False
            
            if event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    model.update()
                    model.drawGrid(screen, w_width, w_height)
            if event.type == timer_event:
                    model.update()
                    model.drawGrid(screen, w_width, w_height)
                    
        
        screen.fill((128, 128, 128))
                    
        output_wa.setText(slider_wa.getValue())
        output_wi.setText(slider_wi.getValue())
        output_ra.setText(slider_ra.getValue())
        output_ri.setText(slider_ri.getValue())
        
        pygame_widgets.update(event)
        pygame.display.update()
    
    
    pygame.quit()
    

    我尝试了从pygame文档中获得的代码( text )它单独运行很好,但我无法将它集成到我的代码中。

    2 回复  |  直到 1 年前
        1
  •  0
  •   Rabbid76    1 年前

    您需要将事件列表传递给 pygame_widgets.update ,但不是单个事件(另请参阅 Pygame Widgets 使命感 pygame_widget 在事件循环之外 event 没有达到你的预期,因为 事件 总是只包含队列中的最后一个事件对象,因此并非所有事件都传递给 pygame_idget :

    while running:
    
        # get list of events
        events = pygame.event.get()
        
        # use the list of events in the event loop
        for event in events:   
            if event.type == QUIT:
                running = False
            # [...]
    
        # pass list of events to pygame widgets
        pygame_widgets.update(events)
    
    
        # [...]
    
        2
  •  -1
  •   Andreas    1 年前

    您的代码有几个问题,这些问题可能会导致冻结问题:

    多个pygame.display.set_mode()调用:您已经初始化了两个屏幕(screen和win)。你只需要一个。

    事件处理:滑块需要根据事件进行更新,而且您似乎在使用pygame_widets作为滑块,但在事件循环中没有为它们处理事件。

    Repeatedscreen.fill():在模型更新后,您正在用一种颜色填充屏幕,这将擦除所有内容。这意味着即使滑块在工作,你也看不到它们。

    更新变量:在游戏循环之前设置ra、ri、wa和wi,但在循环中没有用这些值更新模型。

    以下是您的代码的重构版本,它解决了这些问题:

    import pygame
    from pygame.locals import *
    import pygame_widgets
    from pygame_widgets import Slider, TextBox
    
    # ... [assuming Model class and other necessary imports are above]
    
    pygame.init()
    w_width = 600
    w_height = 600
    
    screen = pygame.display.set_mode([w_width, w_height])
    
    ra = 3
    ri = 5
    wa = 1
    wi = 0.2
    
    model = Model(rows,cols, ra, ri, wa, wi, 0.5)
    model.drawGrid(screen, w_width, w_height)
    
    slider_wa = Slider(screen, 40, 20, 50, 10, min=0, max=2, step=0.1)
    output_wa = TextBox(screen, 5, 10, 25, 25, fontSize=15)
    output_wa.disable()
    
    # ... [other sliders and text boxes]
    
    ra = slider_ra.getValue()
    ri = slider_ri.getValue()
    wa = slider_wa.getValue()
    wi = slider_wi.getValue()
        
    running = True
    
    time_delay = 100
    timer_event = pygame.USEREVENT + 1
    pygame.time.set_timer(timer_event, time_delay )
    
    while running:
        events = pygame.event.get()
        for event in events:
            if event.type == QUIT:
                running = False
            
            if event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    model.update()
                    model.drawGrid(screen, w_width, w_height)
            if event.type == timer_event:
                    model.update()
                    model.drawGrid(screen, w_width, w_height)
    
            # Update the sliders and text boxes with the current event
            pygame_widgets.update(events)
        
        # Only fill the part of the screen where the model is drawn
        # screen.fill((128, 128, 128), rect=pygame.Rect(0, 50, w_width, w_height-50))
                    
        output_wa.setText(str(slider_wa.getValue()))
        output_wi.setText(str(slider_wi.getValue()))
        output_ra.setText(str(slider_ra.getValue()))
        output_ri.setText(str(slider_ri.getValue()))
    
        pygame.display.update()
    
    pygame.quit()
    
    推荐文章