如何从不同的python脚本访问pygame显示

时间:2018-09-25 13:18:03

标签: python pygame display

我有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()

如何到达当前窗口显示?我需要在这里放置一些东西,而不是“屏幕”。

1 个答案:

答案 0 :(得分:0)

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

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

如果您以常规方式进行操作,则ui类的实例具有对屏幕的引用,该实例将在需要显示的代码中可见的变量中,并且可以通过撰写ui.screen

现在,我了解到您想在游戏中使用tkinter-也许这就是为什么您采用这种尝试不同流程的方法的原因,因为tkinter的正常用法以及几乎所有示例都告诉您致电{{ 1}}。确实,如果您在尝试运行pygame代码的同一过程中执行此操作,则pygame将冻结,因为tkinter循环不会更新您的mainloop。

有两种可能的解决方法:

  1. 您可以像往常一样使用tkinter.mainloop()来保持pygame主循环,并在该循环内调用主tkinter对象的方法while True:。切勿致电update()
  2. 您将pygame循环主体重写为函数,而不是通常的tkinter.mainloop运行该主体,而是在根tkinter对象上使用方法while True:注册对其的调用。在函数体末尾重新注册此调用-然后,使用tkinter的mainloop运行所有内容。

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