1. 程式人生 > 其它 >windows安裝base64_Tkinter+Pyinstaller 快速打造半吊子Windows小程式

windows安裝base64_Tkinter+Pyinstaller 快速打造半吊子Windows小程式

技術標籤:windows安裝base64

對於熟悉使用C/C++來寫程式的可以跳過,作為一個硬體工程師平時用python處理個資料,玩個爬蟲容易上手,時間成本比較小,當然坑也是少不了。最近有個藍芽功率計算的小程式需求,就當練練手。

python中的GUI框架還是很多的,PYQT,Tkinter,Wxpyhton等等,其中Tkinter是原生的無需安裝,就從他入手,很多人說python寫出來的UI特別醜。這點毋庸置疑,粗糙度讓人嘆息。但是我們的目標是實用主義,花最少的時間辦最多的事情(立的flag瞬間就倒)。

1. python程式設計

直接參考Loan calculator using Tkinter這個例子修改一下標籤,插入圖片,並修改計算公式就搞定了(其實後續有更多坑)。

25bc502a6e3e963397e2e410be3be56c.png
def __init__(self):
    # Create a window
    window = Tk()
    window.title("Loan Calculator") # Set title


    # create the input boxes.
    Label(window, text = "Annual Interest Rate").grid(row = 1,
                                    column = 1, sticky = W)
    Label(window, text = "Number of Years").grid(row = 2,
                                column = 1, sticky = W)
    Label(window, text = "Loan Amount").grid(row = 3,
                            column = 1, sticky = W)
    Label(window, text = "Monthly Payment").grid(row = 4,
                                column = 1, sticky = W)
    Label(window, text = "Total Payment").grid(row = 5,
                                column = 1, sticky = W)


    # for taking inputs
    self.annualInterestRateVar = StringVar()     
    Entry(window, textvariable = self.annualInterestRateVar,
                justify = RIGHT).grid(row = 1, column = 2)


    self.numberOfYearsVar = StringVar()
    Entry(window, textvariable = self.numberOfYearsVar,
            justify = RIGHT).grid(row = 2, column = 2)


    self.loanAmountVar = StringVar()
    Entry(window, textvariable = self.loanAmountVar,
        justify = RIGHT).grid(row = 3, column = 2)


    self.monthlyPaymentVar = StringVar()
    lblMonthlyPayment = Label(window, textvariable =
                self.monthlyPaymentVar).grid(row = 4,
                column = 2, sticky = E)


    self.totalPaymentVar = StringVar()
    lblTotalPayment = Label(window, textvariable =
                self.totalPaymentVar).grid(row = 5,
                column = 2, sticky = E)
 
    # create the button
    btComputePayment = Button(window, text = "Compute Payment",
                        command = self.computePayment).grid(
                            row = 6, column = 2, sticky = E)
    # Create an event loop
    window.mainloop()

2.打包python指令碼為EXE程式

打包方法多種多樣Pyinstaller,Py2exe,Nuitka等,但共同的問題都是打包後的體積大,單個程式啟動執行慢,我試過兩個辦法分別在下面介紹一下:

--Pyinstaller

最直接的在python目錄下執行

C:UsersUser>pyinstaller -F -w **.py

預設打包成資料夾形式,如果想要一個單獨的EXE直接加-F,-w去掉windows控制檯,也就是黑框。另外如果不替換圖示,就會預設用pyinstaller的羽毛圖示,一般都會要換成自己的專案圖示-i **.ico。

C:UsersUser>pyinstaller -F -w -i **.ico **.py

另外大家最容易遇到的問題就是圖片問題,如果程式內有圖片,即使打包成一個檔案也是有圖片路徑依賴的。隆重請出base64救場。先將圖片轉成由binary 轉成 文字儲存,例如下面例子中的img_str.

import os, base64
img_str = ‘9j/4AAQSkZJRgABAQAAAQAB****’
img_data = base64.b64decode(img_str)
with open('bt.jpg', 'wb') as f:
        f.write(img_data)
#接下來就可以直接使用jpg檔案了
#最後為了不再目錄中儲存圖片直接remove掉
os.remove("bt.jpg")

總結,我這個簡單的計算器打包大小10MB。。人家用c寫的是70多K,有人說可以用UPX壓縮,但是我壓縮後大小9MB(黑人問號),而且報錯打不開,只能默默加上--noupx,啟動時更氣人,需要7秒鐘,別人秒開。淚目遼。。

--Nutitka

它本質是把python程式碼轉換成python呼叫C API的形式,然後用C編譯器進行編譯,理論上執行快很多。windows上安裝需要MinGW-w64,下載非常緩慢。等一切就緒,我們就開始打包,完事一看原來還是一個資料夾,裡面各種依賴檔案,啟動是真快了,但是跟我的目標不一致,太雞肋放棄。更別提安裝編譯過程中的各種waring和error。

#Usage: nuitka [--module] [--execute] [options] main_module.py
C:UsersUser>nutika --standalone --remove-output --windows-disable-console --windows-icon=ICON_PATH **.py