Python 打造顏值評分應用(二):基於tkinter開發界面

首先描述一下需求:

在開始時,有按鈕“選擇文件”,點擊後能自動打開文件夾選中圖片文件,選中文件後,點擊“確定”按鈕,打開子界面,展示圖片和顏值評分。具體如圖所示(先說好,圖片隨便找的,可不是本人,我哪有那麼醜,我可是當地吳彥祖,啊哈哈哈哈):

廈大渣男胡程
廈大渣男胡程

OK,畫餅充飢,餅已經畫好了,下面是具體實現。

首先說第一個選擇圖片文件的界面怎麼實現。

選擇文件界面

這個比較簡單。首先佈置好條條框框:

root = tk.Tk()
root.title("GUI")
fm1=tk.Frame(root)
path = tk.StringVar()

Ltop=tk.Label(fm1,text="請選擇圖片路徑")
B1=tk.Button(fm1, text = "路徑選擇", command =selectPath)
E1=tk.Entry(fm1, textvariable =path,bd=5)
# imagePath=path.get()
B2=tk.Button(fm1, text = "確定", command =lambda:secondWindow(path.get()))

Ltop.pack(side = tk.TOP)
B1.pack(side=tk.LEFT)
E1.pack(side = tk.LEFT)
B2.pack(side=tk.LEFT)
fm1.pack(side=tk.TOP)
root.mainloop()

第一行相當於建立了最底層的一個大畫布,以後所有條條框框都是在這個畫布上搞。fm1=tk.Frame相當於建立了一塊小畫布。Ltop就是用來顯示文字的。
path:對於tkinter來說,你想顯示一些字符串並不是僅僅寫一個字符串變量就行了,而是需要tk的stringvar類以及其set方法。

B1是一個按鈕,按鈕上面寫的是“路徑選擇”,如果你點擊了這個按鈕,那麼就會執行selectPath這個函數。

E1是一個輸入文本框,這裏我們把輸入的文字直接用選中的文件路徑來賦值了。

B2也是一個按鈕,按鈕文字爲“確定”,點擊按鈕時,會執行secondWindow(path.get())函數,其實也就是用來佈局子界面的函數。

以上是定義了一些條條框框,但還沒告訴系統到底這些條條框框應該放在具體哪個位置,誰在前誰在後。下面就開始佈局了。

先佈局的Ltop,他的位置是在一個界面的最頂部(tk.Top),我們在初始化Ltop的時候,第一個參數是fm1,所以Ltop是在fm1這塊小畫布的最頂部。

然後佈局B1,E1,B2。因爲B1,E1,B2在初始化時,第一個參數都是fm1,所以B1,E1,B2都是在fm1這塊小畫布的最左邊。都在最左邊那不是重疊了麼?不是,tkinter的這種佈局是與語句順序有關的。相當於B1在最最最左邊,E1挨着B1在左邊(即E1在B1的右邊),B2在E1的右邊,但大家都在一個水平線上。

最後佈局fm1,因爲初始化fm1時,參數是root,所以意思是fm1這塊小畫布(以及小畫布上面的所有組件)在root這塊畫布的最頂部。

然後root.mainloop()。

這裏面說得很輕鬆,但其實有很多坑。比如如何理解tk.Frame這個函數,command =lambda:secondWindow(path.get())這裏爲什麼要用lambda。想要深入瞭解的可以查看我的博客:tkinter Frame函數形象化解析tkinter command函數帶參數不帶參數的區別

下面是定義selectPath和secondWindow兩個函數了。

selectPath比較簡單:

def selectPath():
    path_ = filedialog.askopenfilename()
    path.set(path_)

這裏filedialog.askopenfilename是tkinter中自帶的函數。功能爲文件選擇框,返回值爲你選定文件的絕對路徑。

path之前以前提到了,是stringvar的對象,set方法是字符串賦值了,我們也可以使用path.get來獲得字符串。

子界面

然後是secondWindow(爲了少讓大家費眼讀代碼,這裏只放示意代碼了):

def secondWindow(imagePath):
    # print("進入:",imagePath)
    win=tk.Toplevel()
    panel = tk.Label(win)  # initialize image panel
    win.config(cursor="arrow")
    getImage(imagePath,panel)  # 用於在gui界面上顯示圖片

    '''
    定義組件,然後進行組件位置設定
    '''

    panel.pack(padx=10, pady=10)
    win.mainloop()

這裏需要的注意的是,子界面必須要是tk.Toplevel。secondWindow調用了getImage函數,具體實現如下:

def getImage(imagePath,panel):
    img=cv2.imread(imagePath)
    cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  # 轉換顏色從BGR到RGBA
    current_image = Image.fromarray(cv2image)  # 將圖像轉換成Image對象
    imgtk = ImageTk.PhotoImage(image=current_image)
    panel.imgtk = imgtk
    panel.config(image=imgtk)

這裏需要注意的是,cv2.imread中的imagePath不能含有中文字符,否則就會報出類似這樣的錯誤:

cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor

然後我們就完成整個項目了!寫完肯定是喜悅的,但是如何把自己的喜悅分享給別人。特別是那些本地沒有配置環境的人呢?

我將在 Python 打造顏值評分應用(三):使用pyinstaller打包應用 介紹如何使用pyinstaller把python文件打包成win10應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章