You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Pygame中通过类切换窗口尺寸的技术咨询

Pygame窗口尺寸切换问题的解决方案

我来帮你捋清楚这个问题哈~你创建的类A和类B,为什么实例化A的时候窗口会变成500×500?核心原因其实是Pygame的一个关键特性:在同一个Python进程里,Pygame只能维护一个显示窗口。

不管你创建多少个类实例,每次调用pygame.display.set_mode()都会直接替换掉当前的窗口,而不是新建一个。而且pygame.init()哪怕被调用多次,只有第一次会真正初始化Pygame,后续调用都是无效的,所以两个类的init()不会冲突,但窗口会被后调用的set_mode()覆盖。

先把你给出的类A代码补全(猜你没写完退出逻辑),再补充类B的代码方便理解:

# 类A代码
import pygame
class A:
    def __init__(self):
        pygame.init()
        self.flag = True
    def start(self):
        self.disp = pygame.display.set_mode((500,500))
        while self.flag:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.flag = False  # 补全退出逻辑
            pygame.display.update()
        pygame.quit()
# 类B代码(根据描述补充)
import pygame
class B:
    def __init__(self):
        pygame.init()
        self.flag = True
    def start(self):
        self.disp = pygame.display.set_mode((800,800))
        while self.flag:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.flag = False
            pygame.display.update()
        pygame.quit()

接下来给你两个可行的解决方案:

方案一:用多进程实现独立窗口

如果确实需要同时显示两个不同尺寸的窗口,就得让每个类在单独的进程里运行。每个进程拥有独立的Pygame实例,互相不会干扰。示例代码如下:

import pygame
from multiprocessing import Process

class A:
    def run(self):
        pygame.init()
        flag = True
        disp = pygame.display.set_mode((500,500))
        while flag:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    flag = False
            pygame.display.update()
        pygame.quit()

class B:
    def run(self):
        pygame.init()
        flag = True
        disp = pygame.display.set_mode((800,800))
        while flag:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    flag = False
            pygame.display.update()
        pygame.quit()

if __name__ == "__main__":
    # 启动两个独立进程
    process_a = Process(target=A().run)
    process_b = Process(target=B().run)
    process_a.start()
    process_b.start()
    process_a.join()
    process_b.join()

⚠️ 注意:多进程之间不能直接共享Pygame对象,如果需要传递数据,得用队列、管道这类进程间通信工具。

方案二:在同一个窗口内切换视图

如果不需要同时显示两个窗口,只是想切换不同尺寸的界面,可以让窗口支持动态调整,或者用Surface绘制不同内容再切换显示。比如下面的示例,按A键切换到500×500,按B键切换到800×800:

import pygame

class App:
    def __init__(self):
        pygame.init()
        self.current_size = (500,500)
        # 设置窗口为可调整大小模式
        self.disp = pygame.display.set_mode(self.current_size, pygame.RESIZABLE)
        self.flag = True

    def switch_to_a_size(self):
        self.current_size = (500,500)
        self.disp = pygame.display.set_mode(self.current_size, pygame.RESIZABLE)

    def switch_to_b_size(self):
        self.current_size = (800,800)
        self.disp = pygame.display.set_mode(self.current_size, pygame.RESIZABLE)

    def run(self):
        while self.flag:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.flag = False
                # 键盘事件切换窗口尺寸
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:
                        self.switch_to_a_size()
                    elif event.key == pygame.K_b:
                        self.switch_to_b_size()
            # 填充白色背景,方便看到尺寸变化
            self.disp.fill((255,255,255))
            pygame.display.update()
        pygame.quit()

if __name__ == "__main__":
    app = App()
    app.run()

内容的提问来源于stack exchange,提问作者0Interest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:55