python - 如何使用 pygame 制作自定义最小化、最大化和关闭按钮?
问题描述
我正在pygame中创建游戏,我想添加自定义按钮来最小化、最大化和关闭窗口,类似于 discord 桌面应用程序
解决方案
Pygame 并不真正适合该任务。
这是一个正在运行的示例:
import pygame
import pygame.freetype
import ctypes
user32 = ctypes.WinDLL('user32')
SW_MAXIMISE = 3
SW_SHOWNORMAL = 1
def main():
pygame.init()
flags = pygame.RESIZABLE
screen = pygame.display.set_mode((500, 500), flags)
hWnd = user32.GetForegroundWindow()
orgsize = None
clock = pygame.time.Clock()
min = pygame.Rect((0, 16, 32, 32))
max = pygame.Rect((0, 16, 32, 32))
close = pygame.Rect((0, 16, 32, 32))
min.right = screen.get_rect().right - 90
max.right = screen.get_rect().right - 50
close.right = screen.get_rect().right - 10
font = pygame.freetype.SysFont(None, 32)
font.origin = True
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
return
if e.type == pygame.VIDEORESIZE:
screen = pygame.display.set_mode((e.w, e.h), flags)
min.right = screen.get_rect().right - 90
max.right = screen.get_rect().right - 50
close.right = screen.get_rect().right - 10
if e.type == pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
if close.collidepoint(pos):
return
if min.collidepoint(pos):
pygame.display.iconify()
if max.collidepoint(pos):
if not orgsize:
orgsize = screen.get_rect().size
user32.ShowWindow(hWnd, SW_MAXIMISE)
else:
user32.ShowWindow(hWnd, SW_SHOWNORMAL)
screen = pygame.display.set_mode(orgsize, flags)
orgsize = None
screen.fill((30, 30, 30))
pygame.draw.rect(screen, pygame.Color('dodgerblue'), max)
pygame.draw.rect(screen, pygame.Color('darkorange'), min)
pygame.draw.rect(screen, pygame.Color('darkred'), close)
font.render_to(screen, min.move(7, -10).bottomleft, '_')
font.render_to(screen, max.move(4, -5).bottomleft, 'O')
font.render_to(screen, close.move(4, -5).bottomleft, 'X')
pygame.display.update()
clock.tick(60)
if __name__ == '__main__':
main()
pygame.quit()
最小化很容易:只需调用pygame.display.iconify()
.
关闭也很容易:只需退出主循环。
最大化并不是那么容易:要让它工作,你需要一个可调整大小的窗口,它不适用于无框窗口(至少在 Windows 上)。此外,最大化窗口的代码也是特定于平台的。我上面的示例仅适用于 Windows,因为它使用 user32.dll。
您可以切换到全屏模式,而不是最大化,因此您不必使用 platfrom 特定代码,也不必为分辨率更改而烦恼。
推荐阅读
- java - 如何返回 org.springframework.http.ResponseEntity 包含数据和文件
- android - 一种在反应本机代码中包含 android 库的方法
- typescript - “未定义” json 属性
- xcode - Godot 接管了 Xcode 中的 .scn 文件
- python - 如何在正则表达式中删除少于 2 个点?
- php - Yii2:如何配置引导模式以使用转义键和 Select2?
- php - 登录表单无法从 React 中的后端获取数据
- gitlab - 是否可以允许 CI/CD 作业中的脚本失败?
- c# - C#如何在用户控件变为活动状态时自动刷新文本文件中的数据?
- sql - 重复值