2015-08-21 69 views
0

我剛剛啓動了python,更確切地說pygame,並且我發現自己無法做一件非常簡單的事情:導入文件的 。使用pygame包含問題

下面的代碼:

主文件:

import pygame 
from pygame.locals import * 
from cTile import Tile 


class App: 
    def __init__(self): 
     self._running = True 
     self._display_surf = None 
     self._image_surf = None 
     self._x = 0 
     self._y = 0 
     self.tiles = [] 

    def on_init(self): 
     pygame.init() 
     self._display_surf = pygame.display.set_mode((350,350), pygame.HWSURFACE) 
     self._running = True 
     #self._image_surf = pygame.image.load("myimage.jpg").convert() 
     self._image_surf = pygame.image.load("myimage.jpg").convert() 
     self.tiles = [Tile(0,0,0,0),Tile(1,0,64,0),Tile(0,1,0,64),Tile(1,1,64,64)] 
     m = open("map1.map",'r') 
     r = m.read().split(",") 
     for i in range(len(r)/4): 
      self.tiles.append(Tile(int(r[i*4]),int(r[i*4+1]),int(r[i*4+2]),int(r[i*4+3]))) 
      i = i+3 

    def on_event(self, event): 
     if event.type == QUIT: 
      self._running = False 
     elif event.type == pygame.KEYDOWN: 
      self.key_event(event) 

    def key_event(self,event): 
     if event.key == pygame.K_DOWN: 
      self._y = self._y+16 
     if event.key == pygame.K_UP: 
      self._y = self._y-16 
     if event.key == pygame.K_RIGHT: 
      self._x = self._x+16 
     if event.key == pygame.K_LEFT: 
      self._x = self._x-16 
    def on_loop(self): 
     pass 
    def on_render(self): 
     self._display_surf.fill((0, 0, 0)) 
     for tile in self.tiles: 
      tile.render(self) 
     self._display_surf.blit(self._image_surf,(self._x,self._y), pygame.Rect(0, 0, 16, 16)) 
     pygame.display.flip() 

    def on_cleanup(self): 
     pygame.quit() 

    def on_execute(self): 
     if self.on_init() == False: 
      self._running = False 

     while(self._running): 

      for event in pygame.event.get(): 
       self.on_event(event) 
      self.on_loop() 
      self.on_render() 
     self.on_cleanup() 

if __name__ == "__main__" : 
    theApp = App() 
    theApp.on_execute() 

文件I包括:

class Tile: 
    def __init__(self,_pidx,_pidy,_px,_py): 
     self._image_surf = pygame.image.load("myimage.jpg").convert() 
     self._idx = _pidx 
     self._idy = _pidy 
     self._x = _px 
     self._y = _py 
    def render(self,win): 
     win._display_surf.blit(self._image_surf,(self._x,self._y), pygame.Rect(self._idx*16, self._idy*16, self._idx*16+16, self._idy*16+16)) 

最後的錯誤我得到:

Traceback (most recent call last): 
    File "C:\Users\Morgan\Desktop\test.py", line 70, in <module> 
    theApp.on_execute() 
    File "C:\Users\Morgan\Desktop\test.py", line 57, in on_execute 
    if self.on_init() == False: 
    File "C:\Users\Morgan\Desktop\test.py", line 22, in on_init 
    self.tiles = [Tile(0,0,0,0),Tile(1,0,64,0),Tile(0,1,0,64),Tile(1,1,64,64)] 
    File "C:\Users\Morgan\Desktop\cTile.py", line 3, in __init__ 
    self._image_surf = pygame.image.load("myimage.jpg").convert() 
NameError: global name 'pygame' is not defined 

我正在學習語言現在。我試圖將pygame導入到我的cTile.py文件中,然後嘗試使用pygame.init(),並且仍然出現相同的錯誤。

我雖然進口是做同樣的事情包括將在PHP中,但它顯然不是!

本身的代碼可能會傷害任何對python知之甚少的人,但是我再一次在一小時前就開始了,還有很多事情我必須修復,目前的主要問題包括我無法完全理解!預先感謝您提供的任何幫助!

編輯:當cTile.py中包含的代碼剛剛被粘貼到「Class App:」上面時,一切都運行平穩。

回答

0

您需要import pygame在您的cTile.py文件中。模塊不會繼承其客戶可能(或可能不)已導入的模塊。

+0

確實,正如我所說,我試過,但我現在可能已經保存該文件,因爲它沒有奏效!再次重試,保存,它完美!謝謝! –

+0

理解導入的模塊緩存在'sys.modules'中是相關的,同一個模塊中的任何後續'import'都將使用存儲的值,而不是再次讀取和執行包含的所有代碼 - 所以它不是很昂貴多次導入同一個。 – martineau

+0

這確實是一件很好的事情要知道,我害怕濫用導入程序,但我想這不會是一個問題,如果一切都緩存,必須確保不導入在那裏沒有任何事情做的事情!再次感謝! –