Использование PyQt5 и Pygame в одном файле

Рейтинг: 0Ответов: 1Опубликовано: 24.01.2023

Нужно, чтобы при нажатии кнопки в PyQt сама программа закрывалась и открывалась игра на Pygame. Пытался сделать по-разному, но не вышло. Все открывается одновременно.


from PyQt5.QtWidgets import QWidget, QApplication, QLineEdit, QPushButton, QPlainTextEdit, QVBoxLayout, QCheckBox, \
    QMainWindow, QComboBox
from pong2 import Ui_MainWindow
import sys
import os
import pygame
from random import randint, randrange


class PongInterface(QMainWindow, Ui_MainWindow):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.col1 = 'black'
        self.col2 = 'black'
        self.fps = 60
        self.pushButton.clicked.connect(self.start)

    def start(self):
        self.col1 = self.comboBox.currentText()
        self.col2 = self.comboBox_2.currentText()
        self.fps = self.spinBox.text()
        writer = open('settings.txt', 'w')
        writer.write(self.col1 + '\n' + self.col2 + '\n' + self.fps)
        writer.close()
        QApplication.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = PongInterface()
    win.show()


pygame.init()
all_sprites = pygame.sprite.Group()
horizontal_borders = pygame.sprite.Group()
vertical_borders = pygame.sprite.Group()


class Ball(pygame.sprite.Sprite):
    def __init__(self, radius, x, y):
        super().__init__(all_sprites)
        self.radius = radius
        self.radius = radius
        self.image = pygame.Surface((2 * radius, 2 * radius),
                                    pygame.SRCALPHA, 32)
        pygame.draw.circle(self.image, pygame.Color('red'),
                           (radius, radius), radius)
        self.rect = pygame.Rect(x, y, 2 * radius, 2 * radius)
        self.x = randint(-5, 5)
        self.y = randrange(-5, 5)

    def update(self):
        self.rect = self.rect.move(self.x, self.y)
        if pygame.sprite.spritecollideany(self, horizontal_borders):
            self.y = -self.y
        if pygame.sprite.spritecollideany(self, vertical_borders):
            self.x = -self.x


class Border(pygame.sprite.Sprite):
    def __init__(self, x1, y1, x2, y2):
        super().__init__(all_sprites)
        if x1 == x2:
            self.add(vertical_borders)
            self.image = pygame.Surface([1, y2 - y1])
            self.rect = pygame.Rect(x1, y1, 1, y2 - y1)
        else:
            self.add(horizontal_borders)
            self.image = pygame.Surface([x2 - x1, 1])
            self.rect = pygame.Rect(x1, y1, x2 - x1, 1)


size = width, height = 1000, 800

if type(size[0]) == type(size[1]) == int:
    screen = pygame.display.set_mode(size)
else:
    print('Неправильный формат ввода')
firstplatformcolor = pygame.Color('black')
secondplatformcolor = pygame.Color('black')
ballcolor = pygame.Color('red')

pressed_up1 = pressed_down1 = False
up1 = pygame.K_i
down1 = pygame.K_k

up2 = pygame.K_w
down2 = pygame.K_s

firstplatformcords = [0, 0, 7, 80]
secondplatformcords = [width - 7, height - 80, 7, 80]
ballcords = [width // 2, height // 2]


Border(5, 5, width - 5, 5)
Border(5, height - 5, width - 5, height - 5)

Ball(10, ballcords[0], ballcords[1])


fps = 60 # количество кадров в секунду
clock = pygame.time.Clock()
running = True
while running: # главный игровой цикл
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == up1:
                pressed_up1 = True
                firstplatformcords[1] -= 30
            if event.key == down1:
                firstplatformcords[1] += 30
                pressed_down1 = True

            if event.key == up2:
                pressed_up1 = True
                secondplatformcords[1] -= 30
            if event.key == down2:
                secondplatformcords[1] += 30
                pressed_down1 = True

        if event.type == pygame.KEYUP:
            if event.key == up1:
                pressed_up1 = False
            if event.key == down1:
                pressed_down1 = False
        # обработка остальных событий
        # ...
    # формирование кадра
    # ...

    screen.fill(pygame.Color('white'))
    all_sprites.draw(screen)
    all_sprites.update()
    pygame.draw.rect(screen, firstplatformcolor, firstplatformcords)
    pygame.draw.rect(screen, secondplatformcolor, secondplatformcords)
    # pygame.draw.circle(screen, ballcolor, ballcords, 10)
    # Ball(10, ballcords[0], ballcords[1])
    pygame.display.flip() # смена кадра
    # изменение игрового мира
    # ...
    # временная задержка
    clock.tick(fps)

Файл pong2:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pong2.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(789, 382)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(240, 10, 281, 121))
        font = QtGui.QFont()
        font.setPointSize(28)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(210, 260, 351, 101))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(210, 161, 171, 51))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.comboBox.setFont(font)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(240, 130, 111, 20))
        self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_2.setTextFormat(QtCore.Qt.AutoText)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(420, 130, 111, 20))
        self.label_3.setObjectName("label_3")
        self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox_2.setGeometry(QtCore.QRect(390, 160, 171, 51))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.comboBox_2.setFont(font)
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(340, 210, 81, 21))
        self.label_4.setObjectName("label_4")
        self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
        self.spinBox.setGeometry(QtCore.QRect(340, 230, 81, 22))
        self.spinBox.setObjectName("spinBox")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Лаунчер понга"))
        self.pushButton.setText(_translate("MainWindow", "Играть"))
        self.comboBox.setItemText(0, _translate("MainWindow", "Red"))
        self.comboBox.setItemText(1, _translate("MainWindow", "Black"))
        self.comboBox.setItemText(2, _translate("MainWindow", "Green"))
        self.comboBox.setItemText(3, _translate("MainWindow", "Blue"))
        self.comboBox.setItemText(4, _translate("MainWindow", "Yellow"))
        self.label_2.setText(_translate("MainWindow", "Цвет первого игрока"))
        self.label_3.setText(_translate("MainWindow", "Цвет второго игрока"))
        self.comboBox_2.setItemText(0, _translate("MainWindow", "Red"))
        self.comboBox_2.setItemText(1, _translate("MainWindow", "Black"))
        self.comboBox_2.setItemText(2, _translate("MainWindow", "Green"))
        self.comboBox_2.setItemText(3, _translate("MainWindow", "Blue"))
        self.comboBox_2.setItemText(4, _translate("MainWindow", "Yellow"))
        self.label_4.setText(_translate("MainWindow", "Частота кадров"))

Ответы

▲ 2Принят

Нет времени разбирать ваши скрипты, но покажу примерно как должно быть.

main.py

import sys
from PyQt5.QtWidgets import *

from game import Game


class LauncherWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Лаунчер для игры на PyGame")
        self.setGeometry(100, 100, 600, 400)
        self.ui_components()
        self.show()

    def ui_components(self):
        button = QPushButton("Запустить игру", self)
        button.setGeometry(200, 150, 100, 30)
        button.clicked.connect(self.handler)

    def handler(self):
        self.hide()
        QApplication.exit(0)
        my_game = Game()
        my_game.run()


def main():
    application = QApplication(sys.argv)
    window = LauncherWindow()
    sys.exit(application.exec())


if __name__ == '__main__':
    main()

game.py

import sys
import pygame


class Game:
    def __init__(self):
        # Инициализирует игру и создает объекты экрана
        pygame.init()
        self.screen = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Alien Invasion")
        bg_color = (230, 230, 230)
        self.screen.fill(bg_color)

    @staticmethod
    def run():
        # Запуск основного цикла игры
        while True:
            # Отслеживание событий клавиатуры и мыши
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Отоброжение  последнего прорисованного экрана
            pygame.display.flip()