#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))
Ответ №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