Python & Pygame - Update Select Statement для перемещения объектов - PullRequest
0 голосов
/ 25 августа 2018

Отказ от ответственности: я ни в коем случае не эксперт по кодированию на Python или использованию Pygame.

Я заполняю свой экран объектами из базы данных MySQL. Эти объекты имеют различные атрибуты, например, изображение, ширина, высота, x & y и т. Д. Они появляются, когда я запускаю свой скрипт.

Однако, когда я обновлю их значения в таблице, я ожидаю, что они изменятся во время работы моего скрипта. Вот код, который я сейчас использую:

def get_object():
    cursor1 = database.mydb.cursor(buffered=True)
    cursor1.execute("SELECT * FROM objects")

    myresult1 = cursor1.fetchall()

    for x in myresult1:
        img = pygame.image.load('assets\objects' + x[1])
        display.blit(img, (x[3], x[4]))
        print(x[3])


def refresh():
    get_object()
    pygame.display.update()

Я сейчас вызываю обновление простым ключом (в конечном итоге он будет автоматически вызываться)

def main_loop():
    pygame.event.clear()
    while not g_exit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    refresh()

        display.fill(colors.goldenrod)
        main_window()
        avatar(display_width / 2, main_window_height + 10)
        chat_window()
        controls_window()
        pygame.display.update()


main_loop()

Как я уже сказал, объекты отображаются на экране нормально, и когда я обновляю значения, закрываю и перезапускаю, они появляются в новом месте. Я просто не могу заставить себя обновлять их во время работы скрипта.

1 Ответ

0 голосов
/ 27 августа 2018

Просто подумайте, что ваш код делает шаг за шагом:

  • В вашем основном цикле проверяется, нажата ли K_LEFT.
  • Если да, то звонит refresh()
  • refresh() звонки get_object()
  • get_object() выполняет запрос к базе данных и выводит материал на экран
  • refresh() обновляет экран новыми изменениями, вызывая pygame.display.update()
  • Все это сделано напрасно, потому что, возвращаясь к основному циклу, следующим шагом будет заполнение всего экрана display.fill(colors.goldenrod)
  • теперь ваш экран просто сплошной

Вы можете реструктурировать свой код следующим образом, например:

def get_objects():
    cursor1 = database.mydb.cursor(buffered=True)
    cursor1.execute("SELECT * FROM objects")

    return cursor1.fetchall()

def draw_objects(display, myresult1):
    for x in myresult1:
        img = pygame.image.load('assets\objects' + x[1])
        display.blit(img, (x[3], x[4]))
        print(x[3])

def main_loop():
    my_objects = []
    pygame.event.clear()
    while not g_exit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    my_objects = get_objects()

        display.fill(colors.goldenrod)
        main_window()
        avatar(display_width / 2, main_window_height + 10)
        chat_window()
        controls_window()
        draw_objects(display, my_objects)
        pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...