Как достичь отображения Pygame из другого скрипта Python - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть 3 сценария Python:

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

Iинициализировать pygame в ui.py как:

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 Он запускает окно приложения, и я могу управлять всем из этого файла.

Я могу позвонитьplayer.py из main.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 голосов
/ 27 сентября 2018

Запуск каждого файла Python в отдельном процессе не является обычным способом написания больших (ish) проектов.

Вместо этого вы используете оператор import, чтобы каждый из ваших файлов Python мог иметь доступ и использовать то, что находится в других файлах, и главный файл начальной точки, который управляет всем.

Если вы сделаете это обычным способом, экземпляр вашего ui класса, который имеет ссылку на экран, будет в переменной, видимой в коде, который требует отображения, и вы можете получить экран, написав ui.screen.

Теперь я понимаю, что вы хотите использовать tkinter в своей игре - возможно, именно поэтому вы выбрали этот способ пробовать разные процессы, как обычное использование tkinter, и почти во всех примерах вам говорятtkinter.mainloop() в какой-то момент.В самом деле, если вы сделаете это в том же процессе, где вы пытаетесь запустить код pygame, pygame остановится, поскольку цикл tkinter не обновит ваш основной цикл.

Здесь возможны два подхода:

  1. Вы сохраняете свой основной цикл Pygame как обычно, с while True:, и внутри этого цикла вызываете метод update() вашего основного объекта tkinter.Никогда не звоните tkinter.mainloop.
  2. Вы переписываете свое тело цикла pygame как функцию, и вместо обычного while True: для запуска этого тела зарегистрируйте вызов к нему с помощью метода .after в корневом объекте tkinter.Перерегистрируйте этот вызов в конце тела функции - и затем используйте mainloop tkinter для запуска всего.

Оба метода позволят вам иметь однопоточное приложение, которое запускает и pygame, и tkinterкод - и возможность просто импортировать классы и функции из других модулей Python и получать доступ к их атрибутам при необходимости.

...