0

基本的に、ゲーム用の pygame メニューを作成し、クリックすると他のすべての pygame ウィンドウが読み込まれますが、ユーザーの追加などのいくつかの側面について
は、Tkinter GUI で作成しました。クリックしてpygameにロードすると、Tkinter GUIがロードされません.これを解決する方法を知っている人はいますか、それを機能させるために何か追加する必要があるかどうか.

何かをロードするかのように動作しますが、ロードしません。「mathsvaders」と呼ばれる最初のものは、pygame プログラムとして正常にロードされますが、ハイスコアは tkinter にあり、ロードされません。

...
pos = 1
while True:
    #events
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif e.type == pygame.KEYDOWN:
            if e.key == pygame.K_DOWN:
               pos += 1
               if pos > 5:
                   pos = 1
            elif e.key == pygame.K_UP:
               pos -= 1
               if pos < 1:
                   pos = 5
            elif e.key == pygame.K_RETURN:
               if pos == 1:
                   import MathsvadersReal
            elif e.key == pygame.K_RETURN:
               if pos == 2:
                    import Highscore
            elif pos == 5:
                 pygame.quit()
                 sys.exit()

フォームのコードは次のとおりです。

import Tkinter import Databaseconnector

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        def create_widgets(self):
            # create welcome label
            label1 = Tkinter.Label(self, text = "Hello world")
            label1.grid(row = 0, column = 2, columnspan = 4, sticky = 'E')

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.geometry("250x200")
    app.mainloop()    
4

1 に答える 1

3

2 番目のモジュールでは、その役割をimport果たしているわけではありませんif __name__ == "__main__":。(それがこのイディオムの要点です。つまり、トップレベル スクリプトのときに実行されるコードを提供することです。ただし、ed のときは実行されませんimport。) したがって、Tk アプリとメイン イベント ループを作成することはありません。つまり、Tk コードはありません。何でもでき、GUI は表示されません。

ただし、そのコードを関数に移動して呼び出すだけでこれを修正しようとする前に、アプリが終了するまでループがブロックされるため、そのtkinterループからメイン イベント ループを呼び出すことはできません。pygamepygametkinter

ここでの混乱は、モジュール、スクリプト、プロセス、およびその他の多くのものを混同し、それらをすべて「プログラム」と呼んでいることだと思います。違いの概要については、以下を参照してください。

本当にこれを行いたい場合は、いくつかの可能性があります。

  • pygame正しく接続している限り、任意のイベント ループで動作できます。つまり、最上位のtkinterアプリを作成し、pygameその下でコードを実行できます。
  • 既存のループを保持し、ループを別のスレッドでpygame実行できます。tkinter
  • 代わりtkinterに、pygameGUI ツールキットのいずれかでコードを書き直してください。
  • 説明で言うように、実際に各モジュールを「プログラムの実行」として扱いたい場合は、実際にそれを行います。他のスクリプトを最初の引数としてsubprocess起動するために使用します。sys.executable

同様の Python ファイルをhighscore.pyスクリプトとして実行したり、モジュールとしてインポートしたりできます。これらは、いくつかの点で似ていますが、他の点では異なります。

python highscore.pyたとえば、 DOS/bash/任意のシェルで入力することによって (またはsubprocess.Popen(sys.executable, 'highscore.py')別のプログラム内からのようなものを使用することによって)、スクリプトとして実行します。これにより、新しいプロセスが開始され、Python インタープリターが実行されます。Python インタープリターは からコードを実行し、highscore.pyその後終了します。OS は別々のプロセスを同時に実行する方法を知っているため、これは他のプロセスには影響しません。highscore.pyコードの実行中__name__は、 に設定され"__main__"ます。

import highscore実行中の Python プログラム内で from を実行して、モジュールとしてインポートします。これは新しいプロセスを起動するのではなくhighscore.py、既存の Python プログラムの途中からコードを実行し、次の行に進むだけです。highscore.pyコードの実行中__name__は、 に設定され"highscore"ます。

どちらの方法でも、クラスと関数の定義、および作成したその他のステートメントを含む、すべての最上位モジュール コードが実行されます。チェックを使用してif __name__ == "__main__":、ファイルがスクリプトとして実行されたときに実行されるが、モジュールとしてインポートされたときに実行されない追加のコードを取得します。


また、何かを指摘する価値があります。コードにこれがあります:

 elif e.key == pygame.K_RETURN:
    if pos == 1:
         import MathsvadersReal
    elif e.key == pygame.K_RETURN:
     if pos == 2:
        import Highscore
    elif pos == 5:
     pygame.quit()
     sys.exit()

これがあなたの本当のインデントなら、elif e.key == pygame.K_RETURNは常に True になるので不要ですし、 にたどり着く方法がelif pos == 5:ないので、終了する方法はありません。

于 2013-03-05T20:08:50.570 に答える