Позиция отображения Pygame

#python #pygame #window #monitor

#python #pygame

Вопрос:

Мне нужна позиция окна сразу после того, как я создал окно pygame:

 window = pygame.display.set_mode((width, height), 0, 32)
pygame.init()
  

По умолчанию окно начинается с 0,0 — но мне также нужны x, y, если пользователь изменяет положение окна. Есть идеи?

Комментарии:

1. Вам нужны координаты x, y, если пользователь перемещает окно? Верно? Или вы хотите установить свои собственные координаты при инициализации окна?

2. Я не думаю, что это возможно по умолчанию в Pygame.

Ответ №1:

Мне нужны координаты x, y окна pygame — либо при запуске, либо при перемещении окна. Последнее приятно иметь.

Я понял, как центрировать окно pygame в нижней части экрана:

     pos_x = screen_width / 2 - window_width / 2
    pos_y = screen_height - window_height
    os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (pos_x,pos_y)
    os.environ['SDL_VIDEO_CENTERED'] = '0'
  

Справочная информация: у меня есть координаты x, y, которые связаны с экраном, и я должен преобразовать координаты экрана в локальные координаты окна, чтобы я мог использовать их, например, для отображения координат внутри окна pygame или для удаления координат, которые находятся за пределами окна pygame.

С моим подходом, описанным выше, я знаю начальную позицию. Но я могу использовать только одно окно pygame (потому что оно всегда находится в одной и той же позиции), и что-то пойдет не так, если пользователь переместит окно.

Ответ №2:

Это сработало для меня :

 import os
import pygame
x = 100
y = 45
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x,y)
pygame.init()
screen = pygame.display.set_mode((100,100))
  

Взято из https://www.pygame.org/wiki/SettingWindowPosition

Ответ №3:

Вот пример кода, который возвращает все четыре угловые позиции:

 from ctypes import POINTER, WINFUNCTYPE, windll
from ctypes.wintypes import BOOL, HWND, RECT


# get our window ID:
hwnd = pygame.display.get_wm_info()["window"]

# Jump through all the ctypes hoops:
prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
paramflags = (1, "hwnd"), (2, "lprect")

GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)

# finally get our data!
rect = GetWindowRect(hwnd)
print "top, left, bottom, right: ", rect.top, rect.left, rect.bottom, rect.right

# bottom, top, left, right:  644 98 124 644
  

Ответ №4:

Существует pygame.display.get_wm_info() вызов, который возвращает вам Window обработчик — с этого момента он использует либо X11 или Windows API32 для получения информации из окна через этот обработчик. Я не нашел никакой доступной информации о том, как это сделать.

Итак, просто для ясности: обычного способа сделать это из pygame не существует. Вы должны перейти к другой библиотеке, возможно, используя ctypes , после того, как вы получите обработчик окна.

С другой стороны, если вам нужно манипулировать самим окном, возможно pygame , это не самая подходящая библиотека для вас — вы можете попробовать PyQt или даже GTK — они также предоставляют мультимедийные возможности, будучи более подходящими для работы на уровне окон GUI и других элементов управления

обновление Существуют способы настройки OpenGL серверной части для графики pygame, которые позволят полностью контролировать отображение, включая встраивание его в другое окно, как часть tkinter Qt приложения или. Заинтересованные люди могут поискать немного глубже в этих строках.

Ответ №5:

В Pygame 2 вы можете также импортировать _sdl2.video , чтобы установить положение окна. Обратите внимание, что этот модуль является экспериментальным и может быть изменен в будущих версиях.

 import pygame
from pygame._sdl2.video import Window

pygame.init()

window = Window.from_display_module()
window.position = your_position_tuple
  

В большинстве случаев достаточно использовать переменные среды, как указано в других ответах, но недостатком является то, что после изменения положения окна оно не будет работать во второй раз (по крайней мере, в Pygame 2).

Ответ №6:

Pygame основана на простом DirectMedia Layer (SDL). Следовательно, вы можете установить переменные среды SDL.

См. pygame wiki — SettingWindowPosition :

Вы можете установить положение окна с помощью переменных среды SDL перед инициализацией pygame. Переменные среды могут быть установлены с помощью os.environ dict в python.

 x = 100
y = 0
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x,y)

import pygame
pygame.init()
screen = pygame.display.set_mode((100,100)) 
  

Ответ №7:

(0,0) остается в верхнем левом углу независимо от того, перемещено окно или нет. Если вы пытаетесь заставить (0,0) оставаться физически там, где оно было на экране при инициализации окна, я не думаю, что pygame сможет это сделать. Постарайтесь сделать свой вопрос более понятным, если хотите получить более четкие ответы.

Ответ №8:

Для выполнения этой задачи, когда вы не знаете размер монитора пользователя, используйте screeninfo в дополнение к пакетам pygame и os. Screeninfo не зависит от операционной системы, что означает, что вы можете получить разрешение всех мониторов независимо от операционной системы пользователя.

 import pygame
from screeninfo import get_monitors
import os

# Set the size of the pygame window
window_width = 512
window_height = 288
window_size = (window_width, window_height)

# Get the bounds of the users monitors, and select the first one
monitors = get_monitors() # Get the resolution of all of the users monitors
screen_width = monitors[0].width # Get width of first monitor found
screen_height = monitors[0].height # Get height of first monitor found

# Set the x and y coordinates of the pygame window in relation to the monitor's resolution 
# (I wanted my pygame window to be located in the bottom-right of the monitor)
pos_x = screen_width - window_width # Calculate the x-location
pos_y = screen_height - window_height # Calculate the y-location
os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (pos_x,pos_y) # Set pygame window location

pygame.init() # Initialize the pygame window
self.screen = pygame.display.set_mode(size) # Set the location of the pygame window