2013-04-04 88 views
0

我有一個問題,但我不確定使用什麼語言。我對如何在不使用全局變量的情況下從其他模塊訪問主驅動程序模塊中定義的畫布有點困惑。例如,我已經在driver.py中實例化了畫布,但是試圖從Level.py中繪製。對於上下文來說,它最終將讀取一個文本文件,並根據它從中提取的數據繪製地圖來進行RPG遊戲。這裏是我的代碼:命名空間和訪問Tkinter

Driver.py:

import tkinter 
import Level 


HEIGHT = 1024 
WIDTH = 800 
TILE_SIZE = 32 
VERTICAL_TILES = HEIGHT//TILE_SIZE 
HORIZONTAL_TILES = WIDTH//TILE_SIZE 

root = tkinter.Tk() 
root.title("RPG Land") 
window = tkinter.Canvas(root,width= WIDTH, height=HEIGHT) 


lev = Level.LevelMgr() 
lev.loadLevel() 
lev.drawLevel() 

window.pack() 

root.mainloop() 

Annnd Level.py:

import tkinter 
from driver import window 

class LevelMgr: 
    def __init__(self): 
     self.levelData = [] 
     self.visibleLevel = [] 
     self.tileColors = { 
          0 : 'empty', 
          1 : 'wall', 
          2 : 'bush' } 

    def loadLevel(self): 
     fyle = open('levels/level1','r') 
     count = 0 
     for lyne in fyle: 
      self.levelData.append(lyne) 
      count += 1 


    def drawLevel(self): 
     currentY = 0 
     currentX = 0 
     for col in self.levelData: 
      currentY += 32 
      for t in col: 
       window.create_rectangle(currentX, currentY, 32, 32, fill="blue") 
       currentX += 32 

關於如何構建更好的程序將也能理解的任何建議。在訪問其他命名空間時,這樣做的正確方法是什麼?我是否需要在driver.py上具有「import level」,以及在Level.py中是否需要「導入驅動程序」?對於這樣一個計劃的基本結構我有點困惑。

回答

1

LevelMgr依賴於窗口,所以在__init__明確地將其命名爲:

class LevelMgr: 
    def __init__(self, window): 
     self.window = window 
    def drawLevel(self): 
     ... 
      for t in col: 
       self.window.create_rectangle(currentX, currentY, 32, 32, fill="blue") 

刪除import語句:

from driver import window 

然後,在Driver.py:

lev = Level.LevelMgr(window) 

另一種可能性是在Level.py中簡單地定義window而不是Driver.py

+0

啊我明白了。這就說得通了。所以我必須明確地傳遞一個對窗口的引用才能訪問它?只是爲了好的衡量標準,爲什麼只有導入聲明才起作用?爲什麼這不同於將窗口的引用傳遞給Level模塊? – 2013-04-04 04:29:27

+0

你寫它的方式可能會工作,但它使用循環導入:驅動程序導入級別和級別導入驅動程序。它讓你想知道他們爲什麼不在同一個文件中。如果你希望他們在不同的文件中,那麼最好打破循環導入。讓一個主('Driver')導入輔助模塊('Level')。理想情況下,'LevelMgr'應該是可重複使用和獨立的。無論從外界需要什麼,都應該作爲參數明確傳遞給'__init__'。這樣,人們就明白了使用'LevelMgr'的過程。 – unutbu 2013-04-04 12:40:59