Использование PyQt5 и Pygame в одном файле
Нужно, чтобы при нажатии кнопки в 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", "Частота кадров"))
Источник: Stack Overflow на русском