[英].Kv file not found while compiling to single exe using pyinstaller
我編寫了一個簡單的計算器應用程序,這是我的項目文件<\/strong>
它從解釋器運行良好,當我使用 pyInstaller 將它編譯到目錄時,
但是當我使用
pyinstaller --onefile -w --icon=icon.ico --add-data calc.kv;. main.py<\/code>成單個文件時。
pyinstaller --onefile -w --icon=icon.ico --add-data calc.kv;. main.py<\/code> ,編譯成功,但是當我運行它時,它給了我一個錯誤“找不到kv文件”。
這是我的代碼
**我的主要 Python 文件 **
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.core.window import Window
import sys
import os
Window.size = (450,600)
Builder.load_file("calc.kv")
class Root(Widget ):
def clear(self):
self.ids.score.text = "0"
self.ids.score.color = "000000"
def button_press(self, button):
prior = self.ids.score.text
if "Error" in prior:
prior = ''
elif prior == "0":
self.ids.score.text = ''
self.ids.score.text = f'{button}'
else:
self.ids.score.text = f'{prior}{button}'
def add_sign(self):
prior = self.ids.score.text
if prior[-1] == "-" or prior[-1] == "+" or prior[-1] == "/" or prior[-1] == "*":
pass
else:
self.ids.score.text = f"{prior}+"
def subtract_sign(self):
prior = self.ids.score.text
if prior[-1] == "-" or prior[-1] == "+" or prior[-1] == "/" or prior[-1] == "*":
pass
else:
self.ids.score.text = f"{prior}-"
def multiply_sign(self):
prior = self.ids.score.text
if prior[-1] == "/" or prior[-1] == "+" or prior[-1] == "-" or prior == "**" :
pass
elif "**" in prior:
pass
else:
self.ids.score.text = f"{prior}*"
def divide_sign(self):
prior = self.ids.score.text
if prior[-1] == "-" or prior[-1] == "+" or prior[-1] == "/" or prior[-1] == "*":
pass
else:
self.ids.score.text = f"{prior}/"
def dot(self):
prior = self.ids.score.text
num_list = prior.split("+")
if "+" in prior and "." not in num_list[-1]:
prior = f'{prior}.'
self.ids.score.text = prior
elif "." in prior:
pass
else:
prior = f'{prior}.'
self.ids.score.text = prior
def equals(self):
try :
allowed = ["0","1","2","3","4","5","6","7","8","9","+","-","/","*","%","."]
prior = self.ids.score.text
prior = list(prior)
for i in prior:
if i not in allowed:
self.ids.score.text = "0"
else:
answer = eval(self.ids.score.text)
self.ids.score.text = str(answer)
except:
self.ids.score.text = "Eroor"
def remove(self):
prior = self.ids.score.text
prior = prior[:-1]
self.ids.score.text = prior
def pos_neg(self):
prior = self.ids.score.text
if "-" in prior[0]:
self.ids.score.text = f'{prior.replace("-","")}'
else:
self.ids.score.text = f'-{prior}'
class Calculator(App):
def build(self):
self.icon = "icon.png"
return Root()
if __name__ == '__main__':
Calculator().run()
我相信您已經閱讀了官方文檔<\/a>,否則您將無法走得那么遠,因為當我嘗試執行您的代碼時,我被拋出一個錯誤,即找不到有效的 Window 提供程序。 但是,由於我過去有一些類似的問題,我很好奇。 我認為您的大多數問題都與您的 .kv 文件的名稱與您的 App 類不同的事實有關。 要解決問題:
將您的主 python 文件重命名為
calc.py<\/code>並將您的主類從
Calculator<\/code>重命名為
CalcApp<\/code> 。
此外,注釋或刪除您的行
Builder.load_file("calc.kv")<\/code> 。
通常,基於虛擬環境構建項目以使其干凈且獨立於其他項目是一個好主意。
接下來,安裝您的依賴項。
或者,您可以創建一個
requirements.txt<\/code>文件,以便其他人更容易通過
python -m pip freeze > requirements.txt<\/code>來了解您所需的依賴項
3.一次構建項目<\/h3>
這主要是為了創建一個我們可以使用的 .spec 模板
4.修改.spec文件<\/h3>
我們需要手動添加 Window 提供程序,如上面提到的官方文檔中所述。 將以下內容添加到您的 .spec 文件中:
5. 使用 .spec 文件重建<\/h3>
在此之前,刪除現有的
build<\/code>和
dist<\/code>文件夾——我剛剛發現,否則你可能會陷入無限循環。
就是這樣,您應該有一個 .exe 文件,該文件夾中沒有其他 .kv 文件;否則 - 您可以使用舊策略並手動復制
calc.kv<\/code> ,這不是“黑匣子”。
這里還有稍微修改過的 .py、.kv 和 .spec 文件:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.