首页 > 学技术 > 技术网文 > Python > 正文

[保留] pygtk做了个游戏,还没完成,迫不及待给大家看啦 :D


来源 chinaunix.net 酷勤网整理

windows和linux都可以跑
但是没有用py2exe打包
因为打出来的包不能用
暂时不知道怎么解决
所以只有装了python的朋友可以运行了
直接运行./go.py揍可以啦
呵呵
多提建议呀兄弟们

更新了一下,增加了几个随机事件 :D
谁能帮忙打个windows的单独执行包吗
感激了!!

[ 本帖最后由 bleem1998 于 2006-2-11 18:25 编辑 ]

zhfsj.zip



 wolfg 回复于:2006-02-11 13:51:19

windows安装pygtk有什么要求?


 bleem1998 回复于:2006-02-11 17:41:19

先装python
然后这个(gtk\glade)
http://prdownloads.sourceforge.net/gladewin32/gtk-win32-devel-2.8.10-rc1.exe?download
然后这个(pygtk)
http://ftp.gnome.org/pub/GNOME/sources/pygtk/2.8/pygtk-2.8.4.tar.gz


 wolfg 回复于:2006-02-12 23:49:08

引用:原帖由 bleem1998 于 2006-2-11 17:41 发表
先装python
然后这个(gtk\glade)
http://prdownloads.sourceforge.net/gladewin32/gtk-win32-devel-2.8.10-rc1.exe?download
然后这个(pygtk)
http://ftp.gnome.org/pub/GNOME/sources/pygtk ... 



多谢!我试了一下,windows下的安装:
先安装GTK runtime,可以用这个gladewin32 
http://gladewin32.sourceforge.net/

然后是pygtk的win32port
http://www.mapr.ucl.ac.be/~gustin/win32_ports/
为Python 2.4安装时一定要注意同时下载pycairo,就在pygtk下载链接的下面

呵呵,可以运行你的“珠海浮生记”了。

在windows下运行,有这样的message出现:
引用:D:\Downloads\Python\pygtk\zhfsj\go.py:13: PangoWarning: Couldn't load font "瀹嬩
綋 9" falling back to "Sans 9"
  xml = gtk.glade.XML('zhfsj.glade')
System initialise...
D:\Downloads\Python\pygtk\zhfsj\go.py:22: PangoWarning: Couldn't load font "瀹嬩
綋 9" falling back to "Sans 9"
  gtk.main()
D:\Downloads\Python\pygtk\zhfsj\signal_handle.py:52: PangoWarning: Couldn't load
 font "瀹嬩綋 9" falling back to "Sans 9"
  wd["win_msg"].show_all()


是字体的问题吧?

[ 本帖最后由 wolfg 于 2006-2-12 23:55 编辑 ]


 wolfg 回复于:2006-02-13 00:00:45

用py2exe生成exe文件后,错误信息是这样的。看来是找不到字体的问题。不影响程序的功能
引用:D:\Downloads\Python\pygtk\zhfsj\dist\go.exe:13: PangoWarning: Couldn't load font "宋体 9" falling back to "Sans 9"
D:\Downloads\Python\pygtk\zhfsj\dist\go.exe:22: PangoWarning: Couldn't load font "宋体 9" falling back to "Sans 9"



[ 本帖最后由 wolfg 于 2006-2-13 00:05 编辑 ]


 wolfg 回复于:2006-02-13 00:04:18

引用:原帖由 bleem1998 于 2006-2-11 00:05 发表
谁能帮忙打个windows的单独执行包吗



可以考虑结合py2exe和InnoSetup做一个windows下的安装程序

http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq21.005.htp

有空的话,帮你看看


 bleem1998 回复于:2006-02-13 01:26:08

能否贴一下你的setup.py
我编译出来的总是出现libpango.dll的错误


 wolfg 回复于:2006-02-13 09:27:17

引用:原帖由 bleem1998 于 2006-2-13 01:26 发表
能否贴一下你的setup.py
我编译出来的总是出现libpango.dll的错误 


我用的就是你的setup.py啊


 jejwe 回复于:2006-02-13 14:51:10

引用:原帖由 wolfg 于 2006-2-12 23:49 发表


多谢!我试了一下,windows下的安装:
先安装GTK runtime,可以用这个gladewin32 
http://gladewin32.sourceforge.net/

然后是pygtk的win32port
http://www.mapr ... 


安装不成功啊,我把GTK runtime安装在C盘的GTK目录里,

gtk-2.0和cairo安装在
C:\Program Files\python\Lib\site-packages

一开始老是出现动态链接库的问题,说找不到,于是去GTK下BIN里的DLL文件复制到C:\WINNT\system32,但是这时又出现“无法定位程序输入点libconv_set_relocation_prefix于动态链接库ICONV.DLL上”


 wolfg 回复于:2006-02-13 15:09:22

你装的版本都是什么?


 jejwe 回复于:2006-02-13 15:15:52

PY2.4及上面提供的版本,
我干脆把BIN下的所有DLL库都COPY到system32下了,这下不提示了,不过出现其他问题


 jejwe 回复于:2006-02-13 15:24:33

D:\python\zhfsj>python go.py
go.py:13: PangoWarning: No builtin or dynamically loaded modules
were found. Pango will not work correctly. This probably means
there was an error in the creation of:
  'C:\WINNT\system32\etc\pango\pango.modules'
You may be able to recreate this file by running pango-querymodules.
  xml = gtk.glade.XML('zhfsj.glade')
go.py:13: PangoWarning: _pango_engine_shape_shape: assertion `PANGO_IS_FONT (fon
t)' failed
  xml = gtk.glade.XML('zhfsj.glade')







 wolfg 回复于:2006-02-13 17:24:44

引用:原帖由 jejwe 于 2006-2-13 15:24 发表
D:\python\zhfsj>python go.py
go.py:13: PangoWarning: No builtin or dynamically loaded modules
were found. Pango will not work correctly. This probably means
there was an error in the creation ... 



我的安装过程是这样的:
1. gtk-win32-2.8.10-rc1.exe 
http://gladewin32.sourceforge.net/

2. pycairo-1.0.2-1.win32-py2.4.exe
3. pygtk-2.8.4-1.win32-py2.4.exe
http://www.mapr.ucl.ac.be/~gustin/win32_ports/

[ 本帖最后由 wolfg 于 2006-2-13 17:29 编辑 ]


 bleem1998 回复于:2006-02-13 18:06:06

我打出来的包也出现和jejwe一样的错误


 wolfg 回复于:2006-02-13 20:13:47

引用:原帖由 bleem1998 于 2006-2-13 18:06 发表
我打出来的包也出现和jejwe一样的错误 


参考一下这个
http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq21.002.htp

会不会是因为缺libglade?


 bleem1998 回复于:2006-02-13 22:45:42

估计不是
dist目录下有libglade-2.0-0.dll

搜索了一下错误信息
网上也有人遇到
解决办法是删除libpango-1.0-0.dll这个文件
程序就正常运行了
可是打包确实没有成功
拿到别的机器上用不了


 wolfg 回复于:2006-02-14 13:12:57

py2exe打包后的程序运行还是得需要GTK的runtime library
看这里
http://starship.python.net/crew/theller/moin.cgi/Py2exeAndPyGTK
的最后一段

可以把GTK的runtime library用InnoSetup一起打包制成安装程序


 wolfg 回复于:2006-02-14 16:00:58

我修改过的setup.py

需要先安装InnoSetup
isetup-5.1.6.exe 
http://www.jrsoftware.org/isdl.php
ChineseSimp-11-5.1.0.isl
http://www.jrsoftware.org/files/istrans/

最好也有安装python的ctypes模块
http://starship.python.net/crew/theller/ctypes/

假设GTK已经安装在C:\GTK
Gtk+/Win32 Runtime Environment Installer 2.8.10-rc1 (.exe, 5.21M)
http://gladewin32.sourceforge.net/modules/wfdownloads/visit.php?lid=97

# setup.py

# -*- coding: cp936 -*-
# Author: wolfg

# A setup script showing how to extend py2exe.
#
# In this case, the py2exe command is subclassed to create an installation
# script for InnoSetup, which can be compiled with the InnoSetup compiler
# to a single file windows installer.
#
# By default, the installer will be created as dist\Output\setup.exe.

from distutils.core import setup
import py2exe
import sys
import glob

################################################################
# arguments for the setup() call

livinginzhuhai = dict(
    script = "go.py",
    #other_resources = [],
    #icon_resources = [(1, "check.ico")],
    dest_base = r"bin\go")

zipfile = r"lib\shardlib"

options = {"py2exe": 
            {
              "compressed": 1,
              "optimize": 2,
              "packages": "encodings", 
              "includes": "cairo, pango, pangocairo, atk, gobject",             
            }
          }

################################################################
import os

GTKDIR = 'C:\\gtk\\'
os.environ['PATH'] += ";%s/lib;%s/bin" % (GTKDIR, GTKDIR)

GTK_RUNTIME_FILES = glob.glob(GTKDIR + 'etc\\*\\*')

GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\*.a')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\*.alias')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\*.lib')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\glib-2.0\\include\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\gtk-2.0\\2.4.0\\*\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\gtk-2.0\\include\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\gtkglext-1.0\\include\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\libglade\\2.0\\include\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\pango\\1.4.0\\modules\\*.*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'lib\\pkgconfig\\*.*')

GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\aclocal\\*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\xml\\libglade\\*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\pixmaps\\*.png')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\pixmaps\\glade-2\\*.png')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\locale\\zh_CN\\*\\*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\themes\\Default\\*\\*')
GTK_RUNTIME_FILES += glob.glob(GTKDIR + 'share\\themes\\MS-Windows\\*\\*')

class InnoScript:
    def __init__(self,
                 name,
                 install_dir,
                 lib_dir,
                 dist_dir,
                 windows_exe_files = [],
                 lib_files = [],
                 version = "1.0",
                 output_basename = "Setup"):
        self.lib_dir = lib_dir
        self.dist_dir = dist_dir
        if not self.dist_dir[-1] in "\\/":
            self.dist_dir += "\\"
        self.name = name
        self.install_dir = install_dir
        self.version = version
        self.output_basename = output_basename
        self.windows_exe_files = [self.chop(p) for p in windows_exe_files]
        self.lib_files = [self.chop(p) for p in lib_files]
        

    def chop(self, pathname):
        assert pathname.startswith(self.dist_dir)
        return pathname[len(self.dist_dir):]
    
    def create(self, pathname="dist\\livinginzhuhai.iss"):
        self.pathname = pathname
        ofi = self.file = open(pathname, "w")
        print >> ofi, "; WARNING: This script has been created by py2exe. Changes to this script"
        print >> ofi, "; will be overwritten the next time py2exe is run!"
        print >> ofi, r"[Setup]"
        print >> ofi, r"AppName=%s" % self.name
        print >> ofi, r"AppVerName=%s %s" % (self.name, self.version)
        print >> ofi, r"DefaultDirName={pf}\%s" % self.install_dir
        print >> ofi, r"DefaultGroupName=%s" % self.name
        print >> ofi, r"Compression=lzma"
        print >> ofi, r"SolidCompression=yes"
        print >> ofi, r"OutputBaseFilename=%s" % self.output_basename
        print >> ofi

        print >> ofi, r"[Files]"
        for path in self.windows_exe_files + self.lib_files:
            print >> ofi, r'Source: "%s"; DestDir: "{app}\%s"; Flags: ignoreversion' % (path, os.path.dirname(path))        
        
        for src, dest in [(p, p[len(GTKDIR):]) for p in GTK_RUNTIME_FILES]:
          print >> ofi, r'Source: "%s"; DestDir: "{app}\%s"; Flags: ignoreversion' % (src, os.path.dirname(dest))
        print >> ofi
        
        print >> ofi, r"[Tasks]"
        print >> ofi, r'Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked'
        print >> ofi
        
        print >> ofi, r"[Icons]"
        for path in self.windows_exe_files:
            print >> ofi, r'Name: "{group}\%s"; Filename: "{app}\%s"; WorkingDir: "{app}\%s"' % \
                  (self.name, path, os.path.dirname(path))
        print >> ofi, r'Name: "{group}\Uninstall %s"; Filename: "{uninstallexe}"' % self.name        
        print >> ofi, r'Name: "{userdesktop}\%s"; Filename: "{app}\bin\go.exe"; Tasks: desktopicon; WorkingDir: "{app}\bin"' % self.name
        print >> ofi
        
        print >> ofi, r"[Run]"
        print >> ofi, r'Filename: "{app}\bin\go.exe"; Description: "%s"; Flags: postinstall shellexec skipifsilent' % (u'开始“珠海浮生记”').encode('cp936')
        print >> ofi
        
        print >> ofi, r"[Languages]"
        print >> ofi, r'Name: "cn"; MessagesFile: "C:\Program Files\Inno Setup 5\Languages\ChineseSimp.isl"'
        print >> ofi
        
    def compile(self):
        try:
            import ctypes
        except ImportError:
            try:
                import win32api
            except ImportError:
                import os
                os.startfile(self.pathname)
            else:
                print "Ok, using win32api."
                win32api.ShellExecute(0, "compile",
                                                self.pathname,
                                                None,
                                                None,
                                                0)
        else:
            print "Cool, you have ctypes installed."
            res = ctypes.windll.shell32.ShellExecuteA(0, "compile",
                                                      self.pathname,
                                                      None,
                                                      None,
                                                      0)
            if res < 32:
                raise RuntimeError, "ShellExecute failed, error %d" % res


################################################################

from py2exe.build_exe import py2exe

class build_installer(py2exe):
    # This class first builds the exe file(s), then creates a Windows installer.
    # You need InnoSetup for it.
    def run(self):
        # First, let py2exe do it's work.
        py2exe.run(self)

        lib_dir = self.lib_dir
        dist_dir = self.dist_dir
        
        # create the Installer, using the files py2exe has created.
        script = InnoScript(u"珠海浮生记".encode('cp936'),
                            u"珠海浮生记".encode('cp936'),
                            lib_dir,
                            dist_dir,
                            self.windows_exe_files,
                            self.lib_files,
                            '1.0',
                            output_basename="Setup"
                            )
        print "*** creating the inno setup script***"
        script.create()
        print "*** compiling the inno setup script***"
        script.compile()
        # Note: By default the final setup.exe will be in an Output subdirectory.

################################################################

setup(
    options = options,
    # The lib directory contains everything except the executables and the python dll.
    zipfile = zipfile,
    windows = [livinginzhuhai], 
    # use out build_installer class as extended py2exe build command
    cmdclass = {"py2exe": build_installer},
    data_files=[("bin", ["zhfsj.glade", ])]
    )


[ 本帖最后由 wolfg 于 2006-2-14 16:05 编辑 ]


 bleem1998 回复于:2006-02-14 19:19:05

出现这个错误

D:\zhfsj>python setup.py py2exe
running py2exe
*** searching for required modules ***
Traceback (most recent call last):
  File "setup.py", line 199, in ?
    data_files=[("bin", ["zhfsj.glade", ])]
  File "D:\Python24\lib\distutils\core.py", line 149, in setup
    dist.run_commands()
  File "D:\Python24\lib\distutils\dist.py", line 946, in run_commands
    self.run_command(cmd)
  File "D:\Python24\lib\distutils\dist.py", line 966, in run_command
    cmd_obj.run()
  File "setup.py", line 169, in run
    py2exe.run(self)
  File "D:\Python24\Lib\site-packages\py2exe\build_exe.py", line 197, in run
    self._run()
  File "D:\Python24\Lib\site-packages\py2exe\build_exe.py", line 248, in _run
    self.find_needed_modules(mf, required_files, required_modules)
  File "D:\Python24\Lib\site-packages\py2exe\build_exe.py", line 1144, in find_
eeded_modules
    mf.import_hook(mod)
  File "D:\Python24\Lib\site-packages\py2exe\mf.py", line 103, in import_hook
    return Base.import_hook(self,name,caller,fromlist)
  File "D:\Python24\lib\modulefinder.py", line 124, in import_hook
    q, tail = self.find_head_package(parent, name)
  File "D:\Python24\lib\modulefinder.py", line 178, in find_head_package
    raise ImportError, "No module named " + qname
ImportError: No module named pangocairo
D:\zhfsj>



 wolfg 回复于:2006-02-15 09:30:37

[color=#FF0000]ImportError: No module named pangocairo[/color]
你有安装pycairo模块吗?
http://www.mapr.ucl.ac.be/~gustin/win32_ports/binaries/pycairo-1.0.2-1.win32-py2.4.exe


 bleem1998 回复于:2006-02-15 19:43:09

果然是没有安装pycairo
可是安装后打包依然不行
运行时错误是一样的。。。。

不过InnoSetup这个东西着实不错!!
:D

[ 本帖最后由 bleem1998 于 2006-2-15 19:54 编辑 ]


 wolfg 回复于:2006-02-16 09:18:57

引用:原帖由 bleem1998 于 2006-2-15 19:43 发表
果然是没有安装pycairo
可是安装后打包依然不行
运行时错误是一样的。。。。

不过InnoSetup这个东西着实不错!!
:D 



呵呵,我用InnoSetup很久了。

我上面的那个脚本中创建的InnoSetup工程里已经包含GTK的runtime了,我这里试了,安装在没有GTK的机器上是没有问题的。


 Groot 回复于:2006-02-16 11:07:12

唉.......我下不了啊.


 yuki-angel 回复于:2006-03-01 14:29:11

打包不能用么?


 bleem1998 回复于:2006-03-01 18:02:23

我在windows下打的包不能用
不太会用py2exe
:(


 wolfg 回复于:2006-03-02 09:28:15

引用:原帖由 bleem1998 于 2006-3-1 18:02 发表
我在windows下打的包不能用
不太会用py2exe
:( 



我写的setup.py也不行吗?


 bleem1998 回复于:2006-03-02 16:19:58

8行
一样的错误
我想可能是我们用的GTK不一样吧


 镜花缘 回复于:2006-03-26 22:28:21

不是很明白.建议写详细一点.




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=698985
转载请注明作者名及原文出处



收藏本页到: