我有3个python脚本:
我在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()
如何到达当前窗口显示?我需要在这里放置一些东西,而不是“屏幕”。
答案 0 :(得分:0)
让每个Python文件在单独的进程中运行不是尝试编写大型项目的通常方法。
相反,您使用import
语句,以便每个Python文件都可以访问和使用其他文件上的内容,以及可以编排所有内容的主起点文件。
如果您以常规方式进行操作,则ui
类的实例具有对屏幕的引用,该实例将在需要显示的代码中可见的变量中,并且可以通过撰写ui.screen
。
现在,我了解到您想在游戏中使用tkinter
-也许这就是为什么您采用这种尝试不同流程的方法的原因,因为tkinter的正常用法以及几乎所有示例都告诉您致电{{ 1}}。确实,如果您在尝试运行pygame代码的同一过程中执行此操作,则pygame将冻结,因为tkinter循环不会更新您的mainloop。
有两种可能的解决方法:
tkinter.mainloop()
来保持pygame主循环,并在该循环内调用主tkinter对象的方法while True:
。切勿致电update()
。 tkinter.mainloop
运行该主体,而是在根tkinter对象上使用方法while True:
注册对其的调用。在函数体末尾重新注册此调用-然后,使用tkinter的mainloop运行所有内容。这两种方法都将允许您运行一个同时运行pygame和tkinter代码的单线程应用程序-并能够简单地从其他Python模块导入类和函数,并在需要时访问它们的属性。