Захват событий клавиатуры с использованием Pygame, но без отображения окна дисплея [дубликат]

mov msg, %rsi

Эта команда интерпретирует данные в msg как 64-битное значение и загружает это значение в регистр rsi. Инструкция НЕ загружает адрес «msg» в регистр rsi. Это можно сделать (обратите внимание на $):

mov $msg, %rsi

В соответствии с тем, что я прочитал, программа должна вызвать sys_exit, или это будет segfault, но этого не произойдет .

Вы должны знать, почему происходит segfault:

ЦП не знает, где находится «конец» вашей программы. ЦПУ также не может различать команды и данные.

Например, байты 0x8A, 0x07 могут означать mov (%rdi),%al или они могут представлять номер 1930 - ЦП не знает.

Достигнув конца вашей программы, CPU попытается прочитать байты после вашей программы и интерпретировать их как инструкцию.

Теперь возможны три сценария:

  • По мере управления ОЗУ в 4096 байтовых блоках на системах x86. Поэтому в зависимости от длины вашей программы до 4095 байт «неиспользуемой» ОЗУ следуют вашей программе. ЦП будет интерпретировать (случайные) байты в ОЗУ как (ассемблерные) инструкции и выполнять эти инструкции. При достижении конца 4096 байтового блока происходит segfault.
  • 4095 байтов содержат инструкцию, которая вызывает segfault (до достижения конца блока).
  • 4095 байт представляют собой команды, которые вызывают выход программы без каких-либо исключений или бесконечного цикла.

Так что, возможно, в вашем случае это третья ситуация.

3
задан RatstabOfficial 18 December 2015 в 04:10
поделиться

3 ответа

DrevanTronder прав, но он не отвечает на вопрос правильно, так как вы спрашиваете, как делать события в pygame без GUI, как показано в вашем примере кодирования.

Это невозможно. При запуске Pygame-программы он обнаруживает события только в том случае, если выбрано окно Pygame. Если нет окна Pygame, выбирать нечего, поэтому события не будут работать. Ниже приводится документация Pygame:

«Если дисплей не был инициализирован и видеорежим не установлен, очередь событий не будет работать». https://www.pygame.org/docs/ref/event.html

Но, конечно, если вы специально не говорите об обработке событий, тогда DrevanTronder верен ; все, что вам нужно сделать, это импортировать модуль с «import pygame» и инициализировать его с помощью «pygame.init ()».

Надеюсь, что это поможет!

2
ответ дан Douglas - 15 year old Pythoner 31 August 2018 в 19:46
поделиться

Да, вы можете.

import pygame

pygame.init()
while 1:
    print pygame.time.get_ticks()
    pygame.time.wait(10)

Это даст вам время в миллисекундах, так как pygame начался без появления графического пользовательского интерфейса.

0
ответ дан DrevanTonder 31 August 2018 в 19:46
поделиться

Если вы используете Linux, вы можете использовать Xvfb .

В принципе, Xvfb «захватывает» все вычисления, связанные с отображением, и выполняет их в памяти без необходимости дисплей.

Он может не соответствовать вашим целям, в зависимости от поведения вашей ОС. Захват ключей в PyGame работает только в том случае, если окно PyGame является активным, но, увидев, что вы не сможете установить активное окно здесь, это, вероятно, не будет работать без дополнительных обходных путей.

0
ответ дан skytreader 31 August 2018 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: