关于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
相关产品推荐
相关产品推荐

