使pygame可调整大小的窗口可以捕捉到屏幕上

时间:2020-05-27 01:59:14

标签: python pygame

我创建了一个简单的屏幕,其中包括:

user_display = pg.display.Info()

win = pg.display.set_mode((user_display.current_w, user_display.current_h), pg.RESIZABLE)

这将创建一个可以调整大小的窗口,该窗口将自身设置为用户当前的屏幕大小。问题在于窗口的位置偏向角落。理想情况下,默认情况下,理想的效果是单击窗口顶部的全屏图标时会发生的情况。有没有一种方法可以将其设置为使屏幕自动捕捉到顶部?

2 个答案:

答案 0 :(得分:3)

我猜您在谈论最大化窗口,而不是全屏模式。

如果只关心Windows,则可以使用Win32-API最大化窗口(使用win32gui模块):

import pygame
import win32gui
import win32con

def main():
    pygame.init()
    screen = pygame.display.set_mode((800, 600), pygame.RESIZABLE)
    win32gui.ShowWindow(win32gui.GetForegroundWindow(), win32con.SW_MAXIMIZE)

    ball = pygame.Rect(0, 300, 32, 32)
    dir = 1

    while True:
        events = pygame.event.get()

        for e in events:
            if e.type == pygame.QUIT:
                return
            if e.type == pygame.VIDEORESIZE:
                screen = pygame.display.set_mode((e.w,e.h), pygame.RESIZABLE)
                ball = pygame.Rect(0, int(e.h/2), 32, 32)

        if not screen.get_rect().contains(ball):
            dir *= -1
        ball.move_ip(dir, 0)

        screen.fill((30, 30, 30))
        pygame.draw.rect(screen, pygame.Color("dodgerblue"), ball)
        pygame.display.flip()
main()

如果您想最大化其他系统(例如Linux)上的窗口,我不知道,但是您可以将pygame窗口包装在tkinter窗口中并最大化该窗口:

import pygame
import tkinter as tk
import os

def main():
    root = tk.Tk()
    embed = tk.Frame(root, width = 800, height = 600)
    embed.pack(fill="both", expand=True)
    os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
    os.environ['SDL_VIDEODRIVER'] = 'windib'
    root.state('zoomed')
    screen = pygame.display.set_mode((800, 600), pygame.RESIZABLE)

    ball = pygame.Rect(0, 300, 32, 32)
    dir = 1

    while True:
        events = pygame.event.get()

        for e in events:
            if e.type == pygame.QUIT:
                return
            if e.type == pygame.VIDEORESIZE:
                screen = pygame.display.set_mode((e.w,e.h), pygame.RESIZABLE)
                ball = pygame.Rect(0, int(e.h/2), 32, 32)

        if not screen.get_rect().contains(ball):
            dir *= -1
        ball.move_ip(dir, 0)

        screen.fill((30, 30, 30))
        pygame.draw.rect(screen, pygame.Color("dodgerblue"), ball)
        pygame.display.flip()
        root.update()      
main()

答案 1 :(得分:2)

可以在通过pygame.display.set_mode()初始化窗口之前,通过设置环境变量SDL_VIDEO_WINDOW_POS来设置窗口的位置。例如

import os
import pygame

os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" %(20, 20)

pygame.init()
user_display = pg.display.Info()
win = pg.display.set_mode((user_display.current_w, user_display.current_h), pg.RESIZABLE)

另请参见SettingWindowPosition


如果要在程序中更改窗口的位置,则必须先设置位置,然后通过pygame.display.set_mode重新创建显示表面。
参见How to move a no frame pygame windows when user click on it?