我编写了一个小应用程序来测试pyinstaller
在用于根据wxpython
和matplotlib
设置应用程序的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
运行应用程序时,所有这些麻烦都消失了。
以下是我的设置:
这是我的 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')
你知道如何解决这个问题吗?非常感谢