首页 > 解决方案 > 当我使用带有 wxpython 的图像按钮时,使用 pyinstaller 创建 .exe 文件时出现问题

问题描述

我建立了一个算法,给出一个报价找到一本书。我还通过库创建了一个 GUI wxpython。此 GUI 包含一个带有图像的按钮。我有两个问题:

  1. 当我通过它创建.exe文件时,pyinstaller它显示按钮的错误,因为它找不到图像(按钮的图像),我在.py文件的同一文件夹中。因此,当我启动.py文件时,脚本运行良好,但是当我创建.exe文件时,出现错误并且按钮消失。
  2. 当我启动.exe文件时,会在后台打开命令窗口。我可以避免吗?

这里的代码:

import wx
import requests

def FindBook(var):
    ...
    return ('Libro: ' + book + '\n' + 'Autore: ' + author)

class OtherFrame(wx.Frame):
    """
    Class used for creating frames other than the main one
    """

    def __init__(self, var2, title='Il tuo libro', parent=None):
        wx.Frame.__init__(self, parent=parent, title=title, size = (600,400))
        panel2 = wx.Panel(self)
        self.var2 = var2
        my_sizer2 = wx.BoxSizer(wx.VERTICAL)
        my_sizer2.AddStretchSpacer()
        libro = wx.StaticText(panel2, label = var2)
        font_libro = wx.Font(16, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        libro.SetFont(font_libro)
        my_sizer2.Add(libro, 0, wx.ALIGN_CENTER, 5)
        my_sizer2.AddStretchSpacer()
        self.Show()

class MyFrame(wx.Frame):    
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
        panel = wx.Panel(self)
        my_sizer = wx.BoxSizer(wx.VERTICAL)

        my_sizer.AddStretchSpacer()

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        manual = wx.StaticText(panel, label='1) Inserisci la citazione --> ')
        font_manual = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual.SetFont(font_manual)
        hbox.Add(manual)
        manual2 = wx.StaticText(panel, label='2) Clicca sul logo Bibliovago --> ')
        font_manual2 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual2.SetFont(font_manual2)
        hbox.Add(manual2)
        manual3 = wx.StaticText(panel, label='3) Buona lettura')
        font_manual3 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual3.SetFont(font_manual3)
        hbox.Add(manual3)
        my_sizer.Add(hbox,0, wx.ALIGN_CENTER)

        my_sizer.AddStretchSpacer()

        istr = wx.StaticText(panel, label='Inserisci una citazione')
        font_istr = wx.Font(14, wx.MODERN, wx.NORMAL, wx.NORMAL)
        istr.SetFont(font_istr)
        my_sizer.Add(istr, 0, wx.ALL | wx.CENTER, 5)

        self.text_ctrl = wx.TextCtrl(panel)
        my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5)        

        logo_button = wx.Bitmap('LOGO.png')
        self.my_btn = wx.BitmapButton(panel,-1,logo_button)
        self.Bind(wx.EVT_BUTTON, self.SavePhrase, self.my_btn)
        my_sizer.Add(self.my_btn, 0, wx.ALL | wx.CENTER, 5) 


        panel.SetSizer(my_sizer)

        my_sizer.AddStretchSpacer()

    def SavePhrase(self, event):
        var = self.text_ctrl.GetValue()
        var2 = FindBook(var)

        frame = OtherFrame(var2=var2)       

if __name__ == '__main__':
    app = wx.App()
    frm = MyFrame(None, title='BiblioZam', size = (600,400))
    frm.Show()
    app.MainLoop()

谢谢你。

标签: python-3.xwxpythonexepyinstaller

解决方案


我用这个解决了第一个问题:

import sys,os

fig_name = 'LOGO.png'

if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)

else:
    try:
        app_full_path = os.path.realpath(__file__)
        application_path = os.path.dirname(app_full_path)

    except NameError:
        application_path = os.getcwd()


fig_full_path = os.path.join(application_path, fig_name)

第二点使用--windowedwithpyinstaller


推荐阅读