謝作如 浙江省溫州科技高級中學(xué)
人工智能是一種內(nèi)斂的技術(shù),需要借助多模態(tài)交互技術(shù),才能“具象化”。在XEdu的幫助下,學(xué)生不需要編寫代碼也能快速訓(xùn)練出計算機視覺方向的模型,如圖像分類和目標(biāo)檢測。那么,下一步的需求就是如何呈現(xiàn)這一學(xué)習(xí)成果,如結(jié)合攝像頭,編寫出支持實時畫面推理的應(yīng)用程序。筆者曾經(jīng)用PyWebIO、Gradio等庫介紹過AI模型部署方面的案例,但更多的教師希望能編寫一個類似Windows應(yīng)用程序,有一個中規(guī)中矩的圖形用戶界面,方便學(xué)生體驗。于是,筆者認真研究了Python的GUI工具選擇,畢竟給中小學(xué)生使用的工具既要代碼簡潔,又要功能強大。
圖形用戶界面(Graphical User Interface,簡稱GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。圖形用戶界面是一種人與計算機通信的界面顯示格式,允許用戶使用鼠標(biāo)等輸入設(shè)備操縱屏幕上的圖標(biāo)或菜單選項,以選擇命令、調(diào)用文件、啟動程序或執(zhí)行其他一些日常任務(wù)。用戶界面通常包括許多視覺元素,如圖標(biāo)、按鈕、圖形、顯示文本,以及多種輸入控件,如復(fù)選框、文本輸入框等。
Python是一種容易上手、簡單方便的開源編程語言,其第三方的開發(fā)工具數(shù)不勝數(shù),在GUI這個方向同樣有很多的工具可以選擇。比較常用的GUI開發(fā)工具有Tkinter、PyQt、wxPython、Gtk+、Kivy、FLTK和OpenGL等,其中最常用的是Tkinter。Tkinter的優(yōu)點在于是Python內(nèi)置標(biāo)準庫,無需額外安裝,兼容性好,但缺點在于實現(xiàn)效果較為普通,開發(fā)體驗不好。比較受程序員推崇的是PyQt和wxPython,其功能強大,界面優(yōu)美,相關(guān)教程也很多,可惜學(xué)習(xí)曲線有些陡峭。在比較了多款GUI開發(fā)工具之后,筆者最終選擇了PySimpleGUI。
顧名思義,PySimpleGUI是一個簡單的GUI設(shè)計工具。PySimpleGUI的安裝和其他庫一樣,使用pip命令即可。整個庫很小,很快就能完成。參考命令如下:
pip install PySimpleGUI
一個典型的PySimpleGUI代碼,大致包含導(dǎo)入庫、設(shè)計窗體布局、創(chuàng)建窗體、窗體事件控制和關(guān)閉窗體等五個部分。以一個簡單的輸入文本并輸出結(jié)果的程序為例,對核心代碼的作用分析如表1所示。
表1 PySimpleGUI代碼分析
在這段代碼中,最核心的部分是窗體設(shè)計和窗體事件控制部分。其中在“window.read()”返回的信息中,event為按鈕的名稱,values則為一個字典,鍵名是控件的名稱,如“{'in': 'XEdu'}”。仔細觀察PySimpleGUI代碼,會發(fā)現(xiàn)它和Arduino、掌控板之類開源硬件程序的運行邏輯非常類似——用一個無限循環(huán)來處理輸入和輸出窗體事件。該代碼的運行效果如圖1所示,界面樣式規(guī)中矩,看起來并不丑。
圖1
借助這樣的簡單范例,就能寫出帶輸入和輸出功能的程序了??紤]到需要編寫的程序需要結(jié)合攝像頭,界面中得顯示實時畫面,那就要借助Image類型的對象,然后在窗體事件控制部分實時更新畫面即可。
核心代碼介紹:在定義窗口布局中增加Image類型對象,用size來定義畫面的大?。ㄈ鐖D2)。
圖2
核心代碼介紹:實時讀取攝像頭的畫面內(nèi)容,然后用OpenCV的tobytes功能將圖片轉(zhuǎn)化為字節(jié)流,并更新Image對象(如下頁圖3)。
圖3
核心代碼介紹:在事件處理代碼中,調(diào)用了模型推理的函數(shù)“my_inf”,這個函數(shù)使用了BaseDeploy庫。BaseDeploy庫是XEdu的一個組件,支持通用的ONNX模型(如下頁圖4)。
圖4
最終的程序非常簡潔,50行左右,程序運行結(jié)果如下頁圖5所示。
圖5
筆者選擇PySimpleGUI的最大原因在于其內(nèi)置了多個GUI框架。目前它已經(jīng)集成了tkinter、PyQt、wxPython和Remi四種。2021年,筆者曾在《用Python寫一個基于Web的物聯(lián)網(wǎng)應(yīng)用程序》一文中介紹過Remi庫。其支持Web界面開發(fā),也就說用PySimpleGUI也能開發(fā)出Web應(yīng)用。
如果想要將上面的代碼效果以Web界面呈現(xiàn),只要將前面的導(dǎo)入庫“import PySimpleGUI as sg”一句改為“import PySimpleGUIWeb as sg”,其他代碼都不需要改變,體現(xiàn)了“一次編寫、處處運行”的理念。當(dāng)運行程序后,瀏覽器就會自動打開一個頁面,顯示效果如圖6所示。
圖6
也許是有VB和Arduino的編程基礎(chǔ),筆者在用PySimpleGUI編寫GUI的過程中,感覺非常順手??梢姡琍ySimpleGUI很適合有創(chuàng)客教育或者開源硬件編程基礎(chǔ)的師生使用,畢竟在幾分鐘內(nèi)用幾行代碼就可以構(gòu)建自定義GUI布局,是很愉快的編程體驗,再加上PySimpleGUI還內(nèi)置了100多種顏色主題,適合“懶人”拿來就用。一旦能用簡潔的代碼設(shè)計出GUI,相信就會有更多精彩的人工智能應(yīng)用程序涌現(xiàn)出來,讓我們拭目以待吧。