当我在 wxpython 中使用图像按钮时,使用 pyinstaller 创建 .exe 文件时出现问题
Problem with .exe file creation with pyinstaller, when I use an image button with wxpython
我建立了一个算法,根据报价找到一本书。我还通过库 wxpython
创建了一个 GUI。此 GUI 包含一个带有图像的按钮。我有 2 个问题:
- 当我通过
pyinstaller
创建 .exe 文件时,它显示按钮错误,因为它找不到图像(按钮的图像) ,我在 .py 文件的同一文件夹中。因此,当我启动 .py 文件时,脚本运行良好,但是当我创建 .exe 文件时出现错误并且按钮消失。
- 当我启动 .exe 文件时,会在后台打开命令 window。我可以避免吗?
这里是代码:
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()
谢谢。
我用这个解决了第一个问题:
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)
第二点使用--windowed
和pyinstaller
我建立了一个算法,根据报价找到一本书。我还通过库 wxpython
创建了一个 GUI。此 GUI 包含一个带有图像的按钮。我有 2 个问题:
- 当我通过
pyinstaller
创建 .exe 文件时,它显示按钮错误,因为它找不到图像(按钮的图像) ,我在 .py 文件的同一文件夹中。因此,当我启动 .py 文件时,脚本运行良好,但是当我创建 .exe 文件时出现错误并且按钮消失。 - 当我启动 .exe 文件时,会在后台打开命令 window。我可以避免吗?
这里是代码:
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()
谢谢。
我用这个解决了第一个问题:
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)
第二点使用--windowed
和pyinstaller