Почему моя pygame не отвечает через несколько секунд? - PullRequest
1 голос
/ 09 июля 2020

Просто чтобы уточнить, я абсолютно не знаю, что делаю, на самом деле я действительно не уверен, как я дошел до этого. Я написал немного кода, чтобы действовать как автоматический кликер для фермы Minecraft (да, я знаю, что вы можете использовать гораздо более простые методы). Я взял отрывки из различных руководств и сделал некоторые из них сам. Это немного беспорядок. Однако, как только код запускается и делает первый щелчок, окно pygame не отвечает. Понятия не имею почему. Я был бы признателен за любые советы и подсказки, и было бы здорово, если бы я мог поспорить, что эта проблема исправлена, спасибо! 1003 *

    import pygame
    import keyboard
    import time
    import pyautogui
    pygame.init()

    def Click():
        pyautogui.doubleClick(None, None, 1)
        print('Click')
        time.sleep(3)

    def Img(x, y):
        display_surface.blit(Piglin_Img, (x, y))


    white = (255, 255, 255)
    black = (0, 0, 0)

    x = 280
    y = 10
    X = 400
    Y = 100
    Piglin_Img = pygame.image.load('Piglin.png')
    pygame.display.set_icon(pygame.image.load("Icon.png"))
    display_surface = pygame.display.set_mode((X, Y ))
    pygame.display.set_caption('Gold Farm Auto Clicker')
    font = pygame.font.Font('freesansbold.ttf', 20)


    Start_Text = font.render('Press p to start...', True, black, white)
    Run_Text = font.render('Running...', True, black, white)
    Pause_Text = font.render('Paused', True, black, white)

    Start_Text_pos = (10, 10)
    Run_Text_pos = (10, 10)
    Pause_Text_pos = (10, 10)
    Continue_pos = (10, 40)

    display_surface.fill(white)
    display_surface.blit(Start_Text, Start_Text_pos)

    Clicker = False
    running = True

    while running:
     for event in pygame.event.get():
      Img(x, y)

      pygame.event.set_blocked(pygame.MOUSEMOTION)
      pygame.event.set_blocked(pygame.MOUSEBUTTONDOWN)
      pygame.event.set_blocked(pygame.MOUSEBUTTONUP)

       if event.type == pygame.QUIT or \
          event.type == pygame.KEYDOWN and \
          event.key == pygame.K_z:
            running = False

      if event.type == pygame.KEYDOWN and \
         event.key == pygame.K_p:
         print('started')
         display_surface.fill(white)
         display_surface.blit(Run_Text, Run_Text_pos)
         Img(x, y)
         pygame.display.update()
         Clicker = True


     while Clicker:
         if event.type == pygame.KEYDOWN and \
            event.key == pygame.K_x:
            Clicker = False
            display_surface.fill(white)
            display_surface.blit(Start_Text, Continue_pos)
            display_surface.blit(Pause_Text, Pause_Text_pos)
            Img(x, y)
            pygame.display.update()

        Click()
        if event.type == pygame.KEYDOWN and \
            event.key == pygame.K_x:
            Clicker = False
            display_surface.fill(white)
            display_surface.blit(Start_Text, Continue_pos)
            display_surface.blit(Pause_Text, Pause_Text_pos)
            Img(x, y)
            pygame.display.update()



 pygame.display.update()
pygame.quit()

1 Ответ

1 голос
/ 09 июля 2020

Он блокирует обработку очереди событий, когда Clicker становится True. Таким образом, как только кликер начинает цикл, пользовательский ввод не обрабатывается, так как этот l oop никогда не проверяет очередь на наличие новых событий, а просто продолжает повторно обрабатывать тот же (старый) результат события.

Вы возможно, потребуется объединить обработку события в причине while Clicker с основным событием l oop. Может быть, с if Clicker на этих событиях:

pygame.event.set_blocked(pygame.MOUSEMOTION)
pygame.event.set_blocked(pygame.MOUSEBUTTONDOWN)
pygame.event.set_blocked(pygame.MOUSEBUTTONUP)

while running:
    # handle events and user interaction
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN :    # some key was pushed
            if event.key == pygame.K_p:
                print('started')
                Clicker = True               # start the clicker
            elif event.key == pygame.K_x:
                print('stopped')
                Clicker = False              # stop the clicker
            elif event.key == pygame.K_z:
                running = False              # Allow exit here too  


    # Update the screen
    if Clicker:
        # Click mode
        display_surface.fill(white)
        display_surface.blit(Run_Text, Run_Text_pos)
    else:
        # NOT in Click Mode
        display_surface.fill(white)
        display_surface.blit(Start_Text, Continue_pos)
        display_surface.blit(Pause_Text, Pause_Text_pos)

    Img(x, y)
    pygame.display.update()

В любом случае что-то близкое к этому. Без комментариев не сразу понятно, в чем заключается смысл кода, поэтому сложно придумать точное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...