为wxpython + matplotlib应用程序设置linux pyinstaller包

时间:2017-05-02 09:47:29

标签: pyinstaller

我编写了一个小应用程序来测试pyinstaller在用于根据wxpythonmatplotlib设置应用程序的linux包时的行为。 第一次调用pyinstaller生成了spec文件,我进一步调整该文件以完成捆绑。但是,当运行生成的bundle时,我遇到了麻烦。

确实,应用程序启动(例如嵌入了i matplotlib帧的基本wxpython图)但是我收到以下警告和错误:

Gtk-Message: Failed to load module "overlay-scrollbar"
Gtk-Message: Failed to load module "unity-gtk-module"

(app:4383): Gtk-WARNING **: Unable to locate theme engine in module_path: "murrine",

(app:4383): Gtk-WARNING **: Unable to locate theme engine in module_path: "murrine",

...
...
...

(app:4383): Gtk-WARNING **: Unable to locate theme engine in module_path: "murrine",

(app:4383): Gtk-WARNING **: Unable to locate theme engine in module_path: "murrine",

(app:4383): Gtk-WARNING **: Unable to locate theme engine in module_path: "murrine",
Gtk-Message: Failed to load module "canberra-gtk-module"

(app:4383): Gtk-WARNING **: Error loading theme icon 'dialog-question' for stock: Unrecognized image file format

使用我的本地python运行 app.py 脚本时,这些警告会消失。

此外,在退出捆绑的应用程序时,我会在对话框中看到一个没有正确问号图标的wxpython对话框(请参阅下面的 quit_bad.png )。当我运行 app.py 脚本时,一切正常 使用我的本地python(请参阅下面的 quit_good.png )。我很确定第二个问题与第一个问题有些相关。到目前为止,我找不到解决这个问题的方法。我跟踪了一些表明的帖子 如何通过安装gtk相关主题解决警告问题,但这没有帮助,这在某种意义上是正常的,因为它似乎是一个 特定于捆绑时我的应用程序行为的问题 - 当使用我的本地python运行应用程序时,所有这些麻烦都消失了。

以下是我的设置:

  • ubuntu trusty
  • python 2.7.6
  • wxpython 2.8.12.1
  • matplotlib 1.3.1
  • pyinstaller 3.2

这是我的 app.py app.spec 文件:

app.py

from numpy import arange, sin, pi
import matplotlib

matplotlib.use('gtkagg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure

import wx

class CanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

    def draw(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)

class MyFrame(wx.Frame):

    def __init__(self,*args,**kwargs):

        wx.Frame.__init__(self,*args,**kwargs)

        panel = CanvasPanel(self)
        panel.draw()

        self.Bind(wx.EVT_CLOSE, self.on_quit)

    def on_quit(self, event=None):

        d = wx.MessageDialog(None, 'Do you really want to quit ?', 'Question', wx.YES_NO|wx.YES_DEFAULT|wx.ICON_QUESTION)
        if d.ShowModal() == wx.ID_YES:
            self.Destroy()

if __name__ == "__main__":
    app = wx.PySimpleApp()
    fr = MyFrame(None, title='test')
    fr.Show()
    app.MainLoop()

app.spec

block_cipher = None

a = Analysis(['app.py'],
             pathex=['.'],
             binaries=None,
             datas=None,
             hiddenimports=[],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=['_wxagg','_tkagg'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='app',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='app')

你知道如何解决这个问题吗?非常感谢

wxpython - bad

wxpython - good

0 个答案:

没有答案