0

game.pyとmap.pyの2つのファイルがあります。次の簡略化されたコードがそれらに存在します。

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:

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")

game.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.Viewを参照するmap.pyのコードが、それをクラス(クラス本体で定義されている)として検出しますが、上書きされたもの(実際のインスタンス)は検出しないことです。また、Gameはgame.pyではmain .Gameとして知られていますが、map.pyではgame.Gameとして知られています。

誰か助けてもらえますか?

4

2 に答える 2

1

Game.Viewを参照するmap.pyのコードは、それをクラスとして検出します

それView = QGraphicsViewはクラスに設定するためです。を実行した場合にのみインスタンスになりますGame.startclass(正直なところ、このクラス変数を最初にオブジェクトに設定する理由、またはクラスが存在する理由はわかりませんGame。)

また、Gameはgame.pyではmain.Gameとして知られていますが、map.pyではgame.Gameとして知られています。

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

于 2012-04-26T13:19:13.053 に答える
0

ファイルがPythonで読み取られるときはいつでも、クラス定義に達すると、そのクラスを定義します。

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

于 2012-05-05T15:45:41.420 に答える