2014-05-12 47 views
0

編輯:原來真正的錯誤是用字體代碼 - 很顯然,我不得不使用.py文件作品,轉換.exe文件不會

pygame.font.SysFont("some_font", font_size) 

,而不是

pygame.font.Font(None, font_size) 

無處不在在我原來的一段代碼中。

請考慮解決此問題。

我已經和pygame的遊戲,並希望它沒有Python和pygame的計算機上運行,​​對於這事我py2exe和無恥地複製pygame2exe代碼中發現here,調整它爲我的文件的名稱和諸如此類的東西...

轉換(我嘗試了Windows cmd thingy和實際的Python,兩者都有相同的結果)是成功的,當我運行可執行文件時,我得到一個沒有實際背景的黑色窗口,唯一的我看到它的工作是集成在Python代碼中的窗口的圖標和標題。之後我馬上得到這個錯誤信息:

運行時錯誤!此應用程序已請求運行時以不尋常的方式終止它。請聯繫應用程序支持團隊以獲取更多信息。

由於圖標顯示在窗口的左上角(它也必須加載圖像)並且沒有出現背景,所以錯誤很可能在以下幾行之間的某處出現,如果這是由於實際代碼中的某些問題(儘管它在IDLE中起作用)。在那裏,我做以下事情:

  • 定義變量圖像,然後定義另一個變量作爲變量,它是一個副本,所以遊戲作品更快
  • 加載的聲音效果和設置其體積
  • 設置背景音樂,音量並將其設置爲循環

接下來,這些是直到設置背景圖像爲止的代碼行。

running = True 
game = 0 
clock = pygame.time.Clock() 
FPS = 150 
name = "" 
while running==True: 
    screen.fill(0) 
    clock.tick(FPS) 
    for x in range(width/background.get_width()+1): 
     for y in range(height/background.get_height()+1): 
      screen.blit(background,(x*200,y*200)) 

作爲參考,這是setup.py的代碼(儘管我懷疑這就是問題無論如何:

try: 
    from distutils.core import setup 
    import py2exe, pygame 
    from modulefinder import Module 
    import glob, fnmatch 
    import sys, os, shutil 
    import operator 
except ImportError, message: 
    raise SystemExit, "Unable to load module. %s" % message 

#hack which fixes the pygame mixer and pygame font 
origIsSystemDLL = py2exe.build_exe.isSystemDLL # save the orginal before we edit it 
def isSystemDLL(pathname): 
    # checks if the freetype and ogg dll files are being included 
    if os.path.basename(pathname).lower() in ("libfreetype-6.dll", "libogg- 0.dll","sdl_ttf.dll"): # "sdl_ttf.dll" added by arit. 
      return 0 
    return origIsSystemDLL(pathname) # return the orginal function 
py2exe.build_exe.isSystemDLL = isSystemDLL # override the default function with this one 

class pygame2exe(py2exe.build_exe.py2exe): #This hack make sure that pygame default font is copied: no need to modify code for specifying default font 
    def copy_extensions(self, extensions): 
     #Get pygame default font 
     pygamedir = os.path.split(pygame.base.__file__)[0] 
     pygame_default_font = os.path.join(pygamedir, pygame.font.get_default_font()) 

     #Add font to list of extension to be copied 
     extensions.append(Module("pygame.font", pygame_default_font)) 
     py2exe.build_exe.py2exe.copy_extensions(self, extensions) 

class BuildExe: 
    def __init__(self): 
     #Name of starting .py 
     self.script = "test.py" 

     #Name of program 
     self.project_name = "test" 

     #Project url 
     self.project_url = "about:none" 

     #Version of program 
     self.project_version = "0.9" 

     #License of the program 
     self.license = "No license" 

     #Auhor of program 
     self.author_name = "Me" 
     self.author_email = "[email protected]" 
     self.copyright = "Copyright (c) 2009 Me." 

     #Description 
     self.project_description = "Test" 

     #Icon file (None will use pygame default icon) 
     self.icon_file = None 

     #Extra files/dirs copied to game 
     self.extra_datas = ["spiel"] 

     #Extra/excludes python modules 
     self.extra_modules = [] 
     self.exclude_modules = [] 

     #DLL Excludes 
     self.exclude_dll = [''] 
     #python scripts (strings) to be included, seperated by a comma 
     self.extra_scripts = [] 

     #Zip file name (None will bundle files in exe instead of zip file) 
     self.zipfile_name = None 

     #Dist directory 
     self.dist_dir ='dist' 

    ## Code from DistUtils tutorial at http://wiki.python.org/moin/Distutils/Tutorial 
    ## Originally borrowed from wxPython's setup and config files 
    def opj(self, *args): 
     path = os.path.join(*args) 
     return os.path.normpath(path) 

    def find_data_files(self, srcdir, *wildcards, **kw): 
     # get a list of all files under the srcdir matching wildcards, 
     # returned in a format to be used for install_data 
     def walk_helper(arg, dirname, files): 
      if '.svn' in dirname: 
       return 
      names = [] 
      lst, wildcards = arg 
      for wc in wildcards: 
       wc_name = self.opj(dirname, wc) 
       for f in files: 
        filename = self.opj(dirname, f) 

        if fnmatch.fnmatch(filename, wc_name) and not os.path.isdir(filename): 
         names.append(filename) 
      if names: 
       lst.append((dirname, names)) 

     file_list = [] 
     recursive = kw.get('recursive', True) 
     if recursive: 
      os.path.walk(srcdir, walk_helper, (file_list, wildcards)) 
     else: 
      walk_helper((file_list, wildcards), 
         srcdir, 
         [os.path.basename(f) for f in glob.glob(self.opj(srcdir, '*'))]) 
     return file_list 

    def run(self): 
     if os.path.isdir(self.dist_dir): #Erase previous destination dir 
      shutil.rmtree(self.dist_dir) 

     #Use the default pygame icon, if none given 
     if self.icon_file == None: 
      path = os.path.split(pygame.__file__)[0] 
      self.icon_file = os.path.join(path, 'pygame.ico') 

     #List all data files to add 
     extra_datas = [] 
     for data in self.extra_datas: 
      if os.path.isdir(data): 
       extra_datas.extend(self.find_data_files(data, '*')) 
      else: 
       extra_datas.append(('.', [data])) 

     setup(
      cmdclass = {'py2exe': pygame2exe}, 
      version = self.project_version, 
      description = self.project_description, 
      name = self.project_name, 
      url = self.project_url, 
      author = self.author_name, 
      author_email = self.author_email, 
      license = self.license, 

      # targets to build 
      windows = [{ 
       'script': self.script, 
       'icon_resources': [(0, self.icon_file)], 
       'copyright': self.copyright 
      }], 
      options = {'py2exe': {'optimize': 2, 'bundle_files': 1, 'compressed': True, \ 
            'excludes': self.exclude_modules, 'packages': self.extra_modules, \ 
            'dll_excludes': self.exclude_dll, 
            'includes': self.extra_scripts} }, 
      zipfile = self.zipfile_name, 
      data_files = extra_datas, 
      dist_dir = self.dist_dir 
      ) 

      if os.path.isdir('build'): #Clean up build dir 
      shutil.rmtree('build') 

if __name__ == '__main__': 
    if operator.lt(len(sys.argv), 2): 
     sys.argv.append('py2exe') 
    BuildExe().run() #Run generation 
    raw_input("Press any key to continue") #Pause to let user see that things ends 

進一步的信息:

  • 操作系統:Windows 7,32位
  • Pygame版本:1.9.2。(我認爲 - 這是最新版本)
  • Python版本:2.7.6。
  • Py2exe版本:無論最新的一個是
  • 我從來沒有真正有一個MSVCR90.DLL文件版本9.0.21022.8,像py2exe教程特別建議使用。我現在有msvcr71.dll,msvcr100.dll,msvcr100_clr0400.dll和msvcr110_clr0400。DLL(針對這個操作系統),而這似乎是從微軟包可用。這可能代表問題嗎?如果是這樣,我可以從哪裏得到正確的文件?我試圖查找它,但似乎沒有任何下載鏈接(至少不是它給了我現在想要的確切文件)。

如果不是,你知道問題的其他地方嗎?

回答

0

msvcr90.dll隨Microsoft Visual C++ 2008運行時一起提供。抓住你的架構版本,安裝並重試。 Here is the x86 versionhere is the x64 version

+0

我已經嘗試了x86版本,運行它,然後我選擇「修復」而不是「卸載」,這並沒有幫助。我應該先卸載它嗎? (請向我保證,如果我必須這樣做是明智的。) – MMM

+0

實際上並不介意,這是現在解決的問題,而且這是我自己從未想出的。對不起,花時間。 – MMM