【问题标题】:how to reach pygame display from different python script如何从不同的python脚本到达pygame显示
【发布时间】:2019-03-01 03:17:57
【问题描述】:

我有 3 个 python 脚本:

  1. main.py
  2. player.py
  3. ui.py

我在 ui.py 中初始化了一个 pygame,例如:

import pygame
import time
import tkinter

class ui:

    def __init__(self):

        pygame.init()
        pygame.font.init() 
        self.screen = pygame.display.set_mode((1920,1080),pygame.FULLSCREEN)
        pygame.mouse.set_visible(False)

我从 main.py 调用 ui 类 它会启动一个应用程序窗口,我可以通过这个文件管理所有内容。

我可以使用子进程从 main.py 调用 player.py。

 p1 = subprocess.Popen(["python3", "player.py"])

在 player.py 中,我想在已经通过 main.py 显示的应用程序窗口上显示图像。

img = pygame.image.load('a.jpg')
screen.blit(img, (x,y))
pygame.display.update()

如何才能到达当前的窗口显示?我需要这里的东西而不是“屏幕”。

【问题讨论】:

  • 问题是:你真的需要在另一个进程中运行player.py吗?

标签: python pygame display


【解决方案1】:

让每个 Python 文件在单独的进程中运行并不是尝试编写大型(ish)项目的常用方法。

相反,您使用 import 语句,以便您的每个 Python 文件都可以访问和使用其他文件上的内容,以及一个协调所有内容的主起点文件。

如果你用普通的方式来做,你的ui类的实例引用了屏幕将在需要显示的代码中可见的变量中,你可以通过写@来获得屏幕987654323@.

现在,我知道你想在你的游戏中使用tkinter - 也许这就是你采取这种尝试不同进程的原因,因为 tkinter 的正常使用,以及几乎所有的例子,告诉你打电话给tkinter.mainloop()一点。实际上,如果您在尝试运行 pygame 代码的同一进程中执行此操作,则 pygame 将冻结,因为 tkinter 循环不会更新您的主循环。

这里有两种可能的方法:

  1. 您像往常一样使用while True: 保持您的pygame 主循环,并在该循环内调用您的主tkinter 对象的update() 方法。永远不要打电话给tkinter.mainloop
  2. 您将 pygame 循环主体重写为一个函数,而不是通常的 while True: 来运行该主体,而是在您的根 tkinter 对象上使用 .after 方法注册对它的调用。在函数体的末尾重新注册这个调用 - 然后,使用 tkinter 的 mainloop 来运行一切。

这两种方法都允许您拥有一个运行 pygame 和 tkinter 代码的单线程应用程序 - 并且能够简单地从其他 Python 模块导入类和函数并在需要时访问它们的属性。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2021-08-23
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多