[Python] How can I run pygame and PyQt5 together but seperately?

Discussão em 'Python' iniciado por Stack, Junho 16, 2025.

  1. Stack

    Stack Membro Participativo

    I have a question about using pyqt5 and pygame. I have already made a pygame script and a pyqt5 script. The problem is that when I want to make pygame excute the game, it shows a ranking board in pyqt5 and plays game by a pygame script.

    This is my pyqt UI code:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtGui import QMovie
    import rankingUI
    import sys
    import main
    import pickle
    import subprocess

    class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.setFixedSize(800,400)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")

    # create label
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.move(0,0)

    # start button
    self.button = QtWidgets.QPushButton(self.centralwidget)
    self.button.setGeometry(320,300,150,100)
    self.button.setStyleSheet("border-image:url(./assets/ui/start_btn.png); border:0px;")
    self.button.clicked.connect(self.game_start)

    # title
    self.title = QtWidgets.QLabel(self.centralwidget)
    self.title.setGeometry(250, 10, 300, 100)
    self.title.setStyleSheet("border-image:url(./assets/ui/dinotitle.png); border:0px;")

    # input nick
    self.nick_inp = QtWidgets.QLineEdit("ENTER YOUR NICK",self.centralwidget)
    self.nick_inp.setAlignment(QtCore.Qt.AlignCenter)
    self.nick_inp.setGeometry(320,290, 150 ,20)

    #ranking
    self.ranking_btn = QtWidgets.QPushButton(self.centralwidget)
    self.ranking_btn.setStyleSheet("border-image:url(./assets/ui/rank_btn.png); border:0px;")
    self.ranking_btn.setGeometry(730, 325, 50, 50)
    self.ranking_btn.clicked.connect(self.popup_ranking)

    # add popup
    self.add_dia = QtWidgets.QDialog()
    self.rank_dia = QtWidgets.QDialog()


    # add label to main window
    MainWindow.setCentralWidget(self.centralwidget)

    # set qmovie as label
    self.movie = QMovie("assets/ui/dinogif.gif")
    self.label.setMovie(self.movie)
    self.movie.start()

    def game_start(self):
    player_nick = self.nick_inp.text()
    if(len(player_nick)==0):
    self.nick_inp.setText("ENTER YOUR NICK")
    return
    main.game_start(player_nick)

    def popup_ranking(self):
    # ui init
    self.rank_dia.setWindowModality(QtCore.Qt.ApplicationModal)
    self.rank_dia.setWindowTitle("RANKING")
    self.rank_dia.setFixedSize(500,330)
    rank_label = QtWidgets.QLabel("RANKKING")
    rank_label.setAlignment(QtCore.Qt.AlignCenter)
    rank_label.setFont(QtGui.QFont('Arial', 30))
    output = QtWidgets.QTextEdit()
    output.setFont(QtGui.QFont('Ubuntu',15))
    window = QtWidgets.QVBoxLayout()
    window.addWidget(rank_label)
    window.addWidget(output)

    # read data
    rank_list = []
    ranking_dat = open("ranking.dat", 'rb')
    try:
    rank_list = pickle.load(ranking_dat)
    except:
    pass
    ranking_dat.close()


    # write data
    strFormat = '%-18s%-18s%-18s\n'
    strOut = strFormat % ('RANK', 'SCORE', 'NICK')
    rank_num = 1
    strFormat = '%-20s%-20s%-20s\n'
    for x in sorted(rank_list, key=lambda s: s["Score"], reverse=True):
    tmp = []
    tmp.append(str(rank_num))
    rank_num += 1
    for y in x:
    tmp.append(str(x[y]))
    strOut += strFormat % (tmp[0], tmp[2], tmp[1])
    if rank_num == 10:
    break

    output.setText(strOut)
    self.rank_dia.setLayout(window)
    self.rank_dia.show()

    # def score_reg(self):
    # # popup UI setting
    # self.add_dia.setWindowTitle("score registration")
    # self.add_dia.setWindowModality(QtCore.Qt.ApplicationModal)
    # self.add_dia.setFixedSize(300,70)
    #
    # # add widget
    # nick_label = QtWidgets.QLabel("Insert Nickname :")
    # self.nick_input = QtWidgets.QLineEdit()
    # score_label = QtWidgets.QLabel("Your Score : ")
    # self.score_input = QtWidgets.QLabel("333")
    # reg_btn = QtWidgets.QPushButton("register")
    # reg_btn.clicked.connect(self.register)
    #
    # h_box1 = QtWidgets.QHBoxLayout()
    # h_box1.addWidget(nick_label)
    # h_box1.addWidget(self.nick_input)
    #
    # h_box2 = QtWidgets.QHBoxLayout()
    # h_box2.addWidget(score_label)
    # h_box2.addWidget(self.score_input)
    # h_box2.addStretch()
    # h_box2.addWidget(reg_btn)
    #
    # v_box = QtWidgets.QVBoxLayout()
    # v_box.addLayout(h_box1)
    # v_box.addLayout(h_box2)
    #
    # self.add_dia.setLayout(v_box)
    # self.add_dia.show()
    #
    # def register(self):
    # print(self.nick_input.text())
    # print(self.score_input.text())


    if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    window.show()
    sys.exit(app.exec_())


    This is the pygame code:

    import pygame as pyg
    import os
    import random
    import sys
    import pickle
    import pygame.time
    import ui

    nickname = ...
    # 화면 크기
    SCREEN_HEIGHT = 600
    SCREEN_WIDTH = 1600
    SCREEN = ...
    # 달리는 모션 (running1, running2)
    RUNNING_MOTIONS = [pyg.image.load(os.path.join("assets/Dino", "DinoRun1.png")),
    pyg.image.load(os.path.join("assets/Dino", "DinoRun2.png"))]
    # 뛰는 모션, 숙이는 모션 (stooping1, stooping2)
    JUMPING_MOTION = pyg.image.load(os.path.join("assets/Dino", "DinoJump.png"))

    STOOPING_MOTIONS = [pyg.image.load(os.path.join("assets/Dino", "DinoStoop1.png")),
    pyg.image.load(os.path.join("assets/Dino", "DinoStoop2.png"))]
    # 선인장
    SMALL_CACTUS_IMG = [pyg.image.load(os.path.join("assets/Cactus", "SmallCactus1.png")),
    pyg.image.load(os.path.join("assets/Cactus", "SmallCactus2.png")),
    pyg.image.load(os.path.join("assets/Cactus", "SmallCactus3.png"))]
    LARGE_CACTUS_IMG = [pyg.image.load(os.path.join("assets/Cactus", "LargeCactus1.png")),
    pyg.image.load(os.path.join("assets/Cactus", "LargeCactus2.png")),
    pyg.image.load(os.path.join("assets/Cactus", "LargeCactus3.png"))]
    # 새 모션
    BIRD_MOTIONS = [pyg.image.load(os.path.join("assets/Bird", "Bird1.png")),
    pyg.image.load(os.path.join("assets/Bird", "Bird2.png"))]

    # 기타 (구름, 바닥) -> 하트 추가 예정
    CLOUD = pyg.image.load(os.path.join("assets/Other", "Cloud.png"))
    GROUND = pyg.image.load(os.path.join("assets/Other", "Track.png"))


    global points
    class Dinosaur():
    X_Dino = 80
    Y_Dino = 310
    Y_DinoStoop = 340
    Jump_height = 8.5
    hitScale = 0.5
    def __init__(self):
    self.stoop_img = STOOPING_MOTIONS
    self.run_img = RUNNING_MOTIONS
    self.jump_img = JUMPING_MOTION
    self.dino_stoop = False
    self.dino_run = True
    self.dino_jump = False

    self.step_index = 0 # 움직임 인덱스
    self.jump_height = self.Jump_height
    self.image = self.run_img[0] # 0, 1 인덱스 반복하여 애니메이션 구현
    self.dino_hitbox = self.image.get_rect() # 공룡 히트박스 설정
    self.dino_hitbox.x = self.X_Dino * self.hitScale
    self.dino_hitbox.y = self.Y_Dino * self.hitScale

    def update(self, Input):
    if self.dino_stoop:
    self.stoop()
    if self.dino_run:
    self.run()
    if self.dino_jump:
    self.jump()

    if self.step_index >= 10:
    self.step_index = 0
    # 공룡 동작

    # 점프
    if Input[pyg.K_UP] and not self.dino_jump:
    self.dino_stoop = False
    self.dino_run = False
    self.dino_jump = True
    # 숙이기
    elif Input[pyg.K_DOWN] and not self.dino_jump:
    self.dino_stoop = True
    self.dino_run = False
    self.dino_jump = False
    # 달리기
    elif not (self.dino_jump or Input[pyg.K_DOWN]):
    self.dino_stoop = False
    self.dino_run = True
    self.dino_jump = False

    def stoop(self):
    self.image = self.stoop_img[self.step_index // 5]
    self.dino_hitbox = self.image.get_rect()
    self.dino_hitbox.x = self.X_Dino
    self.dino_hitbox.y = self.Y_DinoStoop
    self.step_index += 1

    def run(self):
    self.image = self.run_img[self.step_index // 5] # 5로 해야 속도 맞음
    self.dino_hitbox = self.image.get_rect()
    self.dino_hitbox.x = self.X_Dino
    self.dino_hitbox.y = self.Y_Dino
    self.step_index += 1

    def jump(self):
    self.image = self.jump_img
    if self.dino_jump:
    self.dino_hitbox.y -= self.jump_height * 4
    self.jump_height -= 0.8
    if self.jump_height < - self.Jump_height:
    self.dino_jump = False
    self.jump_height = self.Jump_height

    def draw(self, SCREEN):
    SCREEN.blit(self.image, (self.dino_hitbox.x, self.dino_hitbox.y))

    class Cloud():
    def __init__(self):
    self.x = SCREEN_WIDTH + random.randint(800, 1000)
    self.y = random.randint(50, 100)
    self.image = CLOUD
    self.width = self.image.get_width()

    def update(self):
    self.x -= game_speed
    if self.x < - self.width:
    self.x = SCREEN_WIDTH + random.randint(2600, 3000)
    self.y = random.randint(50, 100)

    def draw(self, SCREEN):
    SCREEN.blit(self.image, (self.x, self.y))

    class Obstacle():
    def __init__(self, image, type):
    self.image = image
    self.type = type
    self.rect = self.image[self.type].get_rect()
    self.rect.x = SCREEN_WIDTH

    def update(self):
    self.rect.x -= game_speed
    if self.rect.x < - self.rect.width:
    obstacles.pop()

    def draw(self, SCREEN):
    SCREEN.blit(self.image[self.type], self.rect)

    class SmallCactus(Obstacle):
    def __init__(self, image):
    self.type = random.randint(0, 2)
    super().__init__(image, self.type)
    self.rect.y = 325

    class LargeCactus(Obstacle):
    def __init__(self, image):
    self.type = random.randint(0, 2)
    super().__init__(image, self.type)
    self.rect.y = 300

    class Bird(Obstacle):
    def __init__(self, image):
    self.type = 0
    super().__init__(image, self.type)
    self.rect.y = 250
    self.index = 0

    def draw(self, SCREEN):
    if self.index >= 9:
    self.index = 0
    SCREEN.blit(self.image[self.index // 5], self.rect)
    self.index += 1


    def main():
    global game_speed, x_ground, y_ground, points, obstacles
    run = True
    clock = pyg.time.Clock()
    cloud = Cloud()
    player = Dinosaur()
    game_speed = 14
    x_ground = 0
    y_ground = 380
    points = 0
    font = pyg.font.Font('freesansbold.ttf', 20)
    obstacles = []
    death_cnt = 0
    def score():
    global points, game_speed
    points += 1
    if points % 100 == 0:
    game_speed += 1

    text = font.render("points: " + str(points), True, (0,0,0))
    text_rect = text.get_rect()
    text_rect.center = (1000, 40)
    SCREEN.blit(text, text_rect)

    def ground():
    global x_ground, y_ground
    image_width = GROUND.get_width()
    SCREEN.blit(GROUND, (x_ground, y_ground))
    SCREEN.blit(GROUND, (image_width + x_ground, y_ground))
    if x_ground <= - image_width:
    SCREEN.blit(GROUND, (image_width + x_ground, y_ground))
    x_ground = 0
    x_ground -= game_speed

    while run:
    for pyEvent in pyg.event.get():
    if pyEvent.type == pyg.QUIT:
    sys.exit()
    SCREEN.fill((255,255,255))
    userInput = pyg.key.get_pressed()
    player.draw(SCREEN)
    player.update(userInput)

    if len(obstacles) == 0:
    if random.randint(0, 2) == 0:
    obstacles.append(SmallCactus(SMALL_CACTUS_IMG))
    elif random.randint(0, 2) == 1:
    obstacles.append(LargeCactus(LARGE_CACTUS_IMG))
    elif random.randint(0, 2) == 2:
    obstacles.append(Bird(BIRD_MOTIONS))

    for ob in obstacles:
    ob.draw(SCREEN)
    ob.update()
    if player.dino_hitbox.colliderect(ob.rect):
    pyg.time.delay(500)
    death_cnt += 1
    menu(death_cnt)

    ground()
    cloud.draw(SCREEN)
    cloud.update()
    score()
    clock.tick(30)
    pyg.display.update()

    def menu(death_cnt):
    global points
    run = True
    if death_cnt == 0:
    points = 0
    while run:
    update(points)
    SCREEN.fill((255,255,255))
    font = pyg.font.Font('freesansbold.ttf', 30) # 폰트 적용 오류......
    if death_cnt == 0:
    text = font.render("Press any key to Start", True, (0,0,0)) # 한글 "시작하기" 로 변경 예정
    text1 = font.render("DinoSaurGame", True, (0,0,0)) # "공룡게임"으로 변경 예정
    elif death_cnt > 0:
    text = font.render("Press any key to Restart", True, (0,0,0))
    score = font.render("Your Score : " + str(points), True, (0,0,0))
    scoreRect = score.get_rect()
    scoreRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 50)
    SCREEN.blit(score, scoreRect)
    textRect = text.get_rect()
    textRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
    SCREEN.blit(text, textRect)
    SCREEN.blit(RUNNING_MOTIONS[0], (SCREEN_WIDTH // 2 - 20, SCREEN_HEIGHT // 2 - 140))
    pyg.display.update()
    for pyEvent in pyg.event.get():
    if pyEvent.type == pyg.QUIT:
    sys.exit()
    if pyEvent.type == pyg.KEYDOWN:
    main()

    def update(score):
    pass


    def game_start(nick):
    pyg.init()
    global SCREEN
    global nickname

    nickname = nick
    SCREEN = pyg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

    menu(death_cnt=0)


    When I quit the pygame window, pyqt5 quits too. How can I only quit the pygame window?

    Continue reading...

Compartilhe esta Página