[英]Pyinstaller and pygubu's calendar frame cause a problem
我做了一個 pygubu python 應用程序,並決定凍結它,在解決了一些簡單的問題后,我遇到了一些我無法解決的問題:
Traceback (most recent call last):
File "main.py", line 138, in <module>
File "pygubu\__init__.py", line 30, in __init__
File "main.py", line 38, in _create_ui
File "pygubu\builder\__init__.py", line 166, in get_object
File "pygubu\builder\__init__.py", line 215, in _realize
File "pygubu\builder\__init__.py", line 215, in _realize
File "pygubu\builder\__init__.py", line 225, in _realize
Exception: Class "pygubu.builder.widgets.calendarframe" not mapped
[13108] Failed to execute script 'main' due to unhandled exception!
我什至導入了一堆 pyugubu 模塊來嘗試解決這個問題,但它仍然不起作用:
from pygubu import builder
from pygubu.builder import ttkstdwidgets
from pygubu.builder import widgets
from pygubu.widgets import calendarframe
from pygubu import widgets
這可能無關緊要,但我用 auto-py-to-exe 凍結了它。 我曾嘗試將其同時用作控制台應用程序、文件夾應用程序以及兩者,但它仍然無法正常工作。
先感謝您。
創建test.py (改編自此處)(我包含了您提到的所有依賴項並列出了它們的屬性和方法以確保包含模塊):
import tkinter as tk
import pygubu
from pygubu import builder
from pygubu.builder import ttkstdwidgets
from pygubu.builder import widgets
from pygubu.widgets import calendarframe
from pygubu import widgets
class HelloWorldApp:
def __init__(self):
#1: Create a builder
self.builder = builder = pygubu.Builder()
#2: Load an ui file
builder.add_from_file('test.ui')
#3: Create the mainwindow
self.mainwindow = builder.get_object('mainwindow')
def run(self):
self.mainwindow.mainloop()
if __name__ == '__main__':
# just some calls to make sure the imports are loaded
print(dir(pygubu))
print(dir(builder))
print(dir(ttkstdwidgets))
print(dir(widgets))
print(dir(calendarframe))
print(dir(widgets))
app = HelloWorldApp()
app.run()
創建test.ui :
<?xml version='1.0' encoding='utf-8'?>
<interface>
<object class="tk.Toplevel" id="mainwindow">
<property name="height">200</property>
<property name="resizable">both</property>
<property name="title" translatable="yes">Hello World App</property>
<property name="width">200</property>
<child>
<object class="ttk.Frame" id="mainframe">
<property name="height">200</property>
<property name="padding">20</property>
<property name="width">200</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
<property name="sticky">nsew</property>
<rows>
<row id="0">
<property name="weight">1</property>
</row>
</rows>
<columns>
<column id="0">
<property name="weight">1</property>
</column>
</columns>
</layout>
<child>
<object class="ttk.Label" id="label1">
<property name="anchor">center</property>
<property name="font">Helvetica 26</property>
<property name="foreground">#0000b8</property>
<property name="text" translatable="yes">Hello World !</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</interface>
pip install pyinstaller pygubu
python -c "import site; print(site.getsitepackages()[-1])"
,導航到返回的路徑)test.py
腳本將整個pygubu
文件夾復制到位置包含test.py
的文件夾中的單行:
python -c "import shutil, site, os; shutil.copytree(site.getsitepackages()[-1]+os.sep+'pygubu', os.getcwd()+os.sep+'pygubu')"
以下語句直接添加.ui
文件以及整個 pygubu package。 然后,從dist/test
文件夾中運行test.exe
。
pyinstaller --clean --add-data=test.ui;. --add-data pygubu;pygubu test.py
我嘗試使用 --onefile 運行 pyinstaller, --onefile
它不起作用, --hidden-import
、 --collect-data
、 --collect-submodules
和--collect-all
也失敗了。 然而,這是一個非常丑陋的解決方案。
在發現一個很棒的模塊 auto-py-to-exe 是什么之后(感謝您提及它),我發現您可以將--collect-all
與--onefile
結合使用,而無需手動復制pygubu
庫。 但是,我無法設法包含 .ui 文件,因此我不得不手動復制:
pyinstaller --noconfirm --onefile --windowed --collect-all "pygubu" "test.py" && python -c "import shutil, os; shutil.copyfile('test.ui', 'dist'+os.sep+'test.ui')"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.