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這個例子修改一下標籤,插入圖片,並修改計算公式就搞定了(其實後續有更多坑)。
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