我正在编写一个具有两个独立框架的小应用程序。
第一帧就像一个视频播放器控制器。它有播放/停止/暂停按钮等。它被命名为 controller.py。
第二帧包含 OpenGL 渲染和其中的许多内容,但所有内容都包装在 Frame() 类中,如上所示。它名为 model.py。
我已经到了最后一部分,我必须将这两个“连接”在一起。有人知道如何从另一个框架 (controller.py) 控制一个框架 (model.py) 吗?
我想做一些类似电影播放器的事情,当你点击播放时它会弹出一个新窗口并播放,直到点击停止按钮。
如果你知道怎么做,请告诉我。(只要告诉我大概的意思就行,不需要具体说明)。
你的问题可以通过模块化设计和事件驱动架构来解决。这种设计允许 controller.py 和 model.py 保持独立,但通过共享的接口和事件来通信。
controller.py
model.py
以下是实现此目标的步骤和大致思路:
controller.py 是主控制器框架,负责管理播放、暂停、停止按钮的状态,并发送事件或信号给渲染窗口(Model)。
on_play_click
on_stop_click
model.py 是独立的 OpenGL 渲染框架,封装在一个类中(如 RenderWindow),具有以下方法:
RenderWindow
start_rendering()
stop_rendering()
pause_rendering()
你可以通过以下方式连接两者:
Controller
示例:
# controller.py from model import RenderWindow class Controller: def __init__(self): self.render_window = RenderWindow() def on_play_click(self): self.render_window.start_rendering() def on_stop_click(self): self.render_window.stop_rendering()
queue.Queue
PyQt
# controller.py import queue from model import RenderWindow class Controller: def __init__(self): self.event_queue = queue.Queue() self.render_window = RenderWindow(self.event_queue) def on_play_click(self): self.event_queue.put("play") def on_stop_click(self): self.event_queue.put("stop")
# model.py import threading import time class RenderWindow: def __init__(self, event_queue): self.event_queue = event_queue self.running = False def start_rendering(self): self.running = True threading.Thread(target=self.render_loop).start() def stop_rendering(self): self.running = False def render_loop(self): while self.running: # Check for events while not self.event_queue.empty(): event = self.event_queue.get() if event == "stop": self.running = False elif event == "play": print("Playing...") # Perform OpenGL rendering time.sleep(0.016) # Simulating frame rendering
编写一个主程序,将两者结合起来。
# main.py from controller import Controller if __name__ == "__main__": controller = Controller() controller.run()
这样,你可以实现一个模块化的应用,controller.py 负责用户交互,model.py 专注于渲染工作。