Обновление положения окна в PySDL2 (помогите!)

#python #window #pysdl2

#python #окно #pysdl2

Вопрос:

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

Я попытался обновить Window.position атрибут окна. Но, несмотря на это и обновление самой surface, никаких изменений не видно. (Окно остается там, где оно было нарисовано изначально).

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

Код:

 import sdl2
import sdl2.ext
import sys

White = sdl2.ext.Color(255,255,255)
Red = sdl2.ext.Color(153,0,0)

class Background(sdl2.ext.SoftwareSpriteRenderSystem):
    def __init__(self,window):
        super(Background,self).__init__(window)
        sdl2.ext.fill(self.surface,sdl2.ext.Color(0,33,66))



def main():
    sdl2.ext.init() # Initialze 
    world = sdl2.ext.World() # Create World
    W = sdl2.ext.Window("Default",size=(400,300), position = None,flags = sdl2.SDL_WINDOW_BORDERLESS) # Create Window


    BG = Background(W)
    world.add_system(BG)
    W.show()
    running = True
    while running:
        events = sdl2.ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
            if event.type == sdl2.SDL_MOUSEBUTTONDOWN:
                X,Y = (300,100)                       # NEW COORDINATES
                print("Updating: . . ")
                W.position = X,Y                      # Updating the coordinates
                print(W.position)    
                W.hide()                       # Tried hiding and showing the window
                W.show()                       # Didn't help unfortunately
        W.refresh()   # Refresh the window. 
    return 0

if __name__ == "__main__":
    sys.exit(main())
  

Моя попытка — просто обновить атрибут .position окна. Но, как я уже говорил ранее, похоже, ничего не происходит.

РЕДАКТИРОВАТЬ: Согласно этому сообщению в блоге. Это практически невозможно.

Ответ №1:

Класс Window вPySDL2 не имеет атрибута position до версии 0.9.2. Это причина, по которой ваш код не работает. Если вы используете функцию SDL2 SDL_SetWindowPosition() напрямую, окно может быть расположено, если ваш оконный менеджер / операционная система поддерживает это (особенно важно для X11 и, например, для оконных менеджеров tiling).

Измените свой код

 print("Updating: . . ")
W.position = X,Y                      # Updating the coordinates
print(W.position)
  

Для

 print("Updating: . . ")
sdl2.SDL_SetWindowPosition(W.window, X, Y)
  

и это должно сработать, учитывая, что расположение окна поддерживается.

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

1. Привет, спасибо! На самом деле я уже пробовал это однажды ранее. Но я продолжал ставить W вместо W.window. Это выдало бы вам сообщение об ошибке: «Экземпляр LP_SDL_Window вместо Window», и тогда я отказался от этого. Большое спасибо!