2012-04-26 7 views
0

私はgame.pyとmap.pyの2つのファイルを持っています。以下の単純化されたコードは、それらの中に存在する:Pythonの静的クラスC#/ Javaスタイル、スコープの違いのエラーを使用

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

from datetime import * 

from map import * 

class Game: 

    Scene = QGraphicsScene 
    View = QGraphicsView 


    @staticmethod 
    def start(): 
     Game.App = QApplication(sys.argv)  
     Game.Scene=QGraphicsScene();  

     Game.Scene.setBackgroundBrush(QBrush(QColor(Qt.green))); 

     Game.View=QGraphicsView(Game.Scene); 
     print Game 
     map=Map() 

     Game.App.exec_() 

if __name__=='__main__': 
    Game.start() 

とファイルmap.py:

__main__.Game 
game.Game 
<class 'PyQt4.QtGui.QGraphicsView'> 
Traceback (most recent call last): 
    File "/home/abiusx/workspace/borj/trunk/game.py", line 119, in <module> 
    Game.start() 
    File "/home/abiusx/workspace/borj/trunk/game.py", line 66, in start 
    map=Map() 
    File "/home/abiusx/workspace/borj/trunk/map.py", line 16, in __init__ 
    v.setWindowTitle("asb") 
TypeError: QWidget.setWindowTitle(QString): first argument of unbound method must have type 'QWidget' 

でgame.py結果を実行

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from game import * 
class Map(QObject): 
    def __init__(self,parent=None): 
     super(Map,self).__init__(parent); 
     print Game 
     v=Game.View 
     print v 
     v.setWindowTitle("sth") 

問題は、マップ内のコードです。 pyは、Game.Viewを参照するクラスとして(クラス本体で定義されているように)クラスとして検出しますが、実際のインスタンスでは上書きされません。 はまた、ゲームは誰も私を助けてもらえmap.py

にgame.pyでメイン .Gameとしてではなくgame.Gameとして知られていますか?

+0

問題は循環参照でした。依存関係のツリーを変更して解決しました – AbiusX

答えて

0

ファイルがPythonで読み込まれるたびに、クラス定義に達するとそのクラスが定義されます。

私のシナリオでは、ゲームとマップの両方が互いに依存していました。これはPythonのよく知られた循環参照問題です。 別のモジュールmain.pyを追加しました。そこにはゲームとマップが使用され、マップにはゲームがありました。問題が解決しました。

1

Game.Viewを参照map.pyのコードは、View = QGraphicsViewがクラスにそれを設定するためのクラス

としてそれを検出します。 Game.startを実行するとインスタンスになるだけです。 (あなたが最初にclassオブジェクトに、このクラスの変数を設定している、またはなぜGameクラスがまったく存在する理由正直に言うと、私は理解していない。)

また、ゲームはゲームでmain.Gameとして知られています.pyでもゲームとして。map.pyのゲーム

モジュールをスクリプトとして実行すると、モジュール名が__main__に変わります。

+0

どうすれば修正できますか?私はJavaスタイルの静的クラスを持っていたいので、私のコード全体でどこでもGame.ViewやGame.Sceneを使って簡単に参照できます。 – AbiusX

+0

Pythonでは、モジュールは静的クラスがJavaで持つ役割を果たします。モジュールスコープに 'View'、' Scene'と 'start'を入れます。 –

+0

どうすればそれらを参照できますか?正確な同じメソッド – AbiusX

関連する問題