簡體   English   中英

"使用 pyinstaller 編譯為單個 exe 時找不到 .Kv 文件"

[英].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 類不同的事實有關。 要解決問題:

1. 匹配 .py 和 .kv 名稱<\/h3>

將您的主 python 文件重命名為calc.py<\/code>並將您的主類從Calculator<\/code>重命名為CalcApp<\/code> 。 此外,注釋或刪除您的行Builder.load_file("calc.kv")<\/code> 。

2.設置和激活虛擬環境<\/h3>

通常,基於虛擬環境構建項目以使其干凈且獨立於其他項目是一個好主意。

接下來,安裝您的依賴項。

或者,您可以創建一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM