54869


pygameを使って書いたスクリーンをpyqt5のサブウィンドウから開いたところ、スクリーンを閉じたときにエラーが吐かれました。以下は実際に書いてみたコードです。

[code]

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    import pygame
    from pygame.locals import *
    
    
    class MainWindow(QWidget):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            makeWindowButton = QPushButton("&make window")
            makeWindowButton.clicked.connect(self.makeWindow)
    
            layout = QHBoxLayout()
            layout.addWidget(makeWindowButton)
            self.setLayout(layout)
    
        def makeWindow(self):
            game()
    
    def game():
        (w,h) = (400,400)   # 画面サイズ
        (x,y) = (w/2, h/2)
        pygame.init()       # pygame初期化
        pygame.display.set_mode((w, h), 0, 32)  # 画面設定
        screen = pygame.display.get_surface()
        player = pygame.image.load("player.png").convert_alpha()    # プレイヤー画像の取得
        (x, y) = (300, 200)
        while (1):
            pygame.display.update()             # 画面更新
            pygame.time.wait(30)                # 更新時間間隔
            screen.fill((0, 20, 0, 0))          # 画面の背景色
            screen.blit(player, (x, y))    # プレイヤー画像の描画
            mouse_pressed = pygame.mouse.get_pressed()
            if mouse_pressed[0]:  # 左クリック
                x, y = pygame.mouse.get_pos()
                x -= player.get_width() / 2
                y -= player.get_height() / 2
    
            for event in pygame.event.get():
                # 終了用のイベント処理
                if event.type == QUIT:          # 閉じるボタンが押されたとき
                    pygame.quit()
                    #sys.exit()
                if event.type == KEYDOWN:       # キーを押したとき
                    if event.key == K_ESCAPE:   # Escキーが押されたとき
                        pygame.quit()
                        #sys.exit()
    
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
        main_window = MainWindow()
    
        main_window.show()
        #sys.exit(app.exec_())
        app.exec_()
    
[/code]

これを起動すると次のようなGUIが作成されます。  
[![画像](https://i.stack.imgur.com/yAl5U.png)](https://i.stack.imgur.com/yAl5U.png)

これのmakewindowボタンを押すことで、次のようなGUIが表示されます。

[![画像２](https://i.stack.imgur.com/LZOws.png)](https://i.stack.imgur.com/LZOws.png)  
この新しいスクリーン上のキャラクターはドラッグすることで動かすことが出来ます。ここで、この新しく作られたスクリーンを閉じると、

[code]

      File "C:/Users/toma/Desktop/pygame/practice.py", line 28, in makeWindow
        game()
    
      File "C:/Users/toma/Desktop/pygame/practice.py", line 39, in game
        pygame.display.update()             # 画面更新
    
    error: video system not initialized
    
[/code]

とエラーが出ます。何処を直せばよいのでしょうか。


CC BY-SA 4.0
2019-05-10T05:55:38.160
54868
2019-05-10T14:34:49.247
26529
question
python3 pyqt5 pygame
pygameのスクリーンをpyqt5のサブウィンドウから開いたらエラーが出た


`pygame.event.get()`のイベントハンドラの中で`pygame.quit()`していたのが原因です。  
pygameだけを使っているプログラムで同様のことをやっていても問題無いのは、その直後に`sys.exit()`を呼んでプログラムを終了しているからでしょう。

いったん`while`ループを抜けてから`pygame.quit()`すれば問題無いです。

`def game():` の部分を以下のようにしてみてください。

[code]

    def game():
        (w,h) = (400,400)   # 画面サイズ
        (x,y) = (w/2, h/2)
        pygame.init()       # pygame初期化
        pygame.display.set_mode((w, h), 0, 32)  # 画面設定
        screen = pygame.display.get_surface()
        player = pygame.image.load("player.png").convert_alpha()    # プレイヤー画像の取得
        (x, y) = (300, 200)
        done = False    #ループ終了フラグをFalseに初期化
        while not done: #終了が指定されていない間はループ
            pygame.display.update()             # 画面更新
            pygame.time.wait(30)                # 更新時間間隔
            screen.fill((0, 20, 0, 0))          # 画面の背景色
            screen.blit(player, (x, y))    # プレイヤー画像の描画
            mouse_pressed = pygame.mouse.get_pressed()
            if mouse_pressed[0]:  # 左クリック
                x, y = pygame.mouse.get_pos()
                x -= player.get_width() / 2
                y -= player.get_height() / 2
    
            for event in pygame.event.get():
                # 終了用のイベント処理
                if event.type == QUIT:          # 閉じるボタンが押されたとき
                    done = True    #ループ終了設定
                if event.type == KEYDOWN:       # キーを押したとき
                    if event.key == K_ESCAPE:   # Escキーが押されたとき
                        done = True    #ループ終了設定
        pygame.quit()    #pygameモジュール終了
    
[/code]


CC BY-SA 4.0
2019-05-10T06:28:01.920
54869
2019-05-10T14:34:49.247
2019-05-10T14:34:49.247
26370
26370
54868
answer