2012-04-26 64 views
0

我有兩個文件,分別是game.py和map.py.下面簡單的代碼駐留在其中:使用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:

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' 

的問題是,在地圖中的代碼。 py引用Game.View,將其檢測爲一個類(如類體中定義的),但不覆蓋它(實際實例)上的內容。 另外遊戲被稱爲主要。遊戲在game.py,但作爲game.Game在map.py

任何人都可以幫助我嗎?

+0

問題在於循環引用。通過更改依賴關係樹來解決它 – AbiusX 2012-04-26 17:48:24

回答

0

無論何時在Python中讀取文件,當它達到類定義時,它都會定義該類。

在我的情況下,遊戲和地圖都相互依賴。這是python中衆所周知的循環引用問題。 我添加了另一個模塊main.py,在其中使用了遊戲和地圖,並在地圖中使用了遊戲。問題解決了。

1

在map.py引用Game.View代碼,檢測爲類

這是因爲它View = QGraphicsView套一類。當您運行Game.start時,它只會成爲一個實例。 (說實話,我不明白你爲什麼這類變量最初設置爲class對象,或爲什麼Game類都存在。)

遊戲也被稱爲main.Game遊戲.py但是作爲game.Game in map.py

將模塊作爲腳本運行時,模塊名稱更改爲__main__

+0

那麼我應該如何解決它?我想擁有Java風格的靜態類,所以在我的整個代碼中的任何地方我都可以輕鬆使用Game.View或Game.Scene來引用它。 – AbiusX 2012-04-26 13:23:50

+0

在Python中,模塊扮演着靜態類在Java中的角色。在模塊範圍內放置'View','Scene'和'start'。 – 2012-04-26 13:54:20

+0

那我該如何引用它們呢?使用完全相同的方法 – AbiusX 2012-04-26 14:16:12