PySimpleGUI:使用 Python 創(chuàng)建 GUI 的簡(jiǎn)單方法

      網(wǎng)友投稿 3131 2025-03-31

      目錄

      PySimpleGUI 入門(mén)

      安裝 PySimpleGUI

      在 PySimpleGUI 中創(chuàng)建基本 UI 元素

      創(chuàng)建簡(jiǎn)單的應(yīng)用程序

      創(chuàng)建 PySimpleGUI 圖像查看器

      將 Matplotlib 與 PySimpleGUI 集成

      將 OpenCV 與 PySimpleGUI 集成

      打包適用于 Windows 的 PySimpleGUI 應(yīng)用程序

      結(jié)論

      創(chuàng)建可跨多個(gè)平臺(tái)工作的簡(jiǎn)單圖形用戶界面 (GUI) 可能很復(fù)雜。但也不必如此。您可以使用 Python 和 PySimpleGUI 包來(lái)創(chuàng)建您和您的用戶都會(huì)喜歡的漂亮的用戶界面!PySimpleGUI 是一個(gè)新的 Python GUI 庫(kù),最近引起了很多人的興趣。

      在本教程中,您將學(xué)習(xí)如何:

      安裝PySimpleGUI 包

      使用 PySimpleGUI創(chuàng)建基本的用戶界面元素

      創(chuàng)建應(yīng)用程序,例如 PySimpleGUI圖像查看器

      將 PySimpleGUI 與Matplotlib集成

      在 PySimpleGUI 中使用計(jì)算機(jī)視覺(jué)

      打包適用于Windows的 PySimpleGUI 應(yīng)用程序

      現(xiàn)在是時(shí)候開(kāi)始了!

      PySimpleGUI 入門(mén)

      PySimpleGUI 于 2018 年推出,因此與wxPython或PyQt 之類的軟件包相比,它是一個(gè)相對(duì)較新的軟件包。

      PySimpleGUI 有四個(gè)端口:

      Tkinter

      PyQt

      wxPython

      Remi

      PySimpleGUI 包裝了這些其他包中的每一個(gè)的部分,并使它們更易于使用。但是,每個(gè)端口都必須單獨(dú)安裝。

      PySimpleGUI 包裝了 Python 附帶的整個(gè) Tkinter。PySimpleGUI 已經(jīng)封裝了 PySide2 的大部分,但只有 wxPython 的一小部分。當(dāng)您安裝 PySimpleGUI 時(shí),默認(rèn)情況下您會(huì)獲得Tkinter變體。有關(guān) Tkinter 的更多信息,請(qǐng)查看使用 Tkinter進(jìn)行Python GUI 編程。

      根據(jù)您使用的 PySimpleGUI 的哪個(gè)變體,您使用 PySimpleGUI 創(chuàng)建的應(yīng)用程序可能看起來(lái)不是其平臺(tái)原生的。但是不要讓這阻止您嘗試 PySimpleGUI。PySimpleGUI 仍然非常強(qiáng)大,只需少量工作即可完成大部分工作。

      安裝 PySimpleGUI

      如果您使用pip ,則安裝 PySimpleGUI 很容易。出于本教程的目的,您將學(xué)習(xí)如何安裝常規(guī) PySimpleGUI 端口,它是 Tkinter 變體。

      這是如何做到的:

      PySimpleGUI:使用 Python 創(chuàng)建 GUI 的簡(jiǎn)單方法

      $ python -m pip install pysimplegui

      這會(huì)將 PySimpleGUI 安裝到您的系統(tǒng) Python 設(shè)置的任何位置。您還可以將 PySimpleGUI 安裝到 Python 虛擬環(huán)境中。如果您不熟悉 Python 虛擬環(huán)境,那么您應(yīng)該閱讀Python 虛擬環(huán)境:入門(mén)。

      如果您更喜歡嘗試 PyQt 變體,則可以pip install PySimpleGUIQt改用。現(xiàn)在您已經(jīng)安裝了 PySimpleGUI,是時(shí)候了解如何使用它了!

      在 PySimpleGUI 中創(chuàng)建基本 UI 元素

      如果您以前曾經(jīng)使用過(guò) GUI 工具包,那么您可能聽(tīng)說(shuō)過(guò)小部件這個(gè)詞。小部件是一個(gè)通用術(shù)語(yǔ),用于描述構(gòu)成用戶界面 (UI) 的元素,例如按鈕、標(biāo)簽、窗口等。在 PySimpleGUI 中,小部件被稱為元素,有時(shí)您可能會(huì)在其他地方看到大寫(xiě)的元素。

      PySimpleGUI 的基本構(gòu)建塊之一是Window().?要?jiǎng)?chuàng)建Window(),您可以執(zhí)行以下操作:

      # hello_world.py import PySimpleGUI as sg sg.Window(title="Hello World", layout=[[]], margins=(100, 50)).read()

      Window()需要很多不同的論點(diǎn)——太多了,無(wú)法在此一一列舉。但是,對(duì)于此示例,您可以給出Window()atitle和 alayout并設(shè)置margins,即 UI 窗口的像素大小。

      read()Window()以字符串和values?字典的形式返回在 中觸發(fā)的任何事件。您將在本教程的后面部分中了解有關(guān)這些的更多信息。

      運(yùn)行此代碼時(shí),您應(yīng)該看到如下內(nèi)容:

      這個(gè)例子除了可能向用戶顯示一條消息之外,并沒(méi)有真正做任何事情。

      通常,您Window()的應(yīng)用程序中除了 a 之外還有其他元素,所以讓我們添加一些文本和一個(gè)按鈕。

      創(chuàng)建一個(gè)名為的新文件hello_psg.py并添加以下代碼:

      # hello_psg.py import PySimpleGUI as sg layout = [[sg.Text("Hello from PySimpleGUI")], [sg.Button("OK")]] # Create the window window = sg.Window("Demo", layout) # Create an event loop while True: event, values = window.read() # End program if user closes window or # presses the OK button if event == "OK" or event == sg.WIN_CLOSED: break window.close()

      大多數(shù) GUI 工具包允許您使用絕對(duì)定位或允許 GUI動(dòng)態(tài)布置元素來(lái)布置元素。例如,wxPython 使用Sizers動(dòng)態(tài)布局元素。如果您想了解有關(guān) wxPython 的更多信息,請(qǐng)查看如何使用 wxPython 構(gòu)建 Python GUI 應(yīng)用程序。

      PySimpleGUI 使用嵌套的Python 列表來(lái)布置其元素。在這種情況下,您添加一個(gè)Text()元素和一個(gè)Button()元素。然后您創(chuàng)建window并傳入您的自定義layout.

      最后的代碼塊是事件循環(huán)。圖形用戶界面需要在循環(huán)內(nèi)運(yùn)行并等待用戶執(zhí)行某些操作。例如,用戶可能需要按下 UI 中的按鈕或使用鍵盤(pán)輸入內(nèi)容。當(dāng)他們這樣做時(shí),這些事件由事件循環(huán)處理。

      當(dāng)您使用 PySimpleGUI 時(shí),您可以通過(guò)創(chuàng)建一個(gè)從對(duì)象讀取事件的無(wú)限while循環(huán)來(lái)創(chuàng)建一個(gè)事件循環(huán)window。如果用戶按下OK按鈕或退出按鈕,那么您希望程序結(jié)束。為了實(shí)現(xiàn)這個(gè)目標(biāo),你break退出循環(huán)及close()的window。

      上面的代碼創(chuàng)建了一個(gè)如下所示的應(yīng)用程序:

      現(xiàn)在您已準(zhǔn)備好創(chuàng)建一個(gè)實(shí)際的應(yīng)用程序!

      創(chuàng)建簡(jiǎn)單的應(yīng)用程序

      您可以使用 PySimpleGUI 創(chuàng)建多種不同的跨平臺(tái) GUI。該軟件包中包含的演示非常廣泛。您可以創(chuàng)建從桌面小部件到成熟用戶界面的任何內(nèi)容。

      在接下來(lái)的幾節(jié)中,您將看到使用 PySimpleGUI 的幾種不同方式。但是,除了單個(gè)教程中可以涵蓋的內(nèi)容之外,您還可以做更多的事情。如果您想了解更多詳細(xì)信息,請(qǐng)務(wù)必查看PySimpleGUI 中包含的其他演示。

      創(chuàng)建 PySimpleGUI 圖像查看器

      PySimpleGUI 的 GitHub 頁(yè)面上的演示之一是圖像查看器。能夠使用 Python 編寫(xiě)自己的自定義圖像查看器很有趣。您可以使用此代碼查看您自己的照片或?qū)⑵浜喜⒁圆榭茨鷱臄?shù)據(jù)庫(kù)下載或讀取的照片。

      為簡(jiǎn)單起見(jiàn),您將使用 PySimpleGUI 的內(nèi)置Image()元素來(lái)查看圖像。不幸的是,該Image()元素只能在 PySimpleGUI 的常規(guī)版本中顯示 PNG 和 GIF 格式。

      如果您希望能夠打開(kāi)其他圖像文件類型,那么您可以下載Pillow,它支持 TIFF、JPG 和 BMP 格式。查看 GitHub 上的 PySimpleGUI 演示文件夾,了解如何執(zhí)行此操作的示例。

      另一方面,如果你安裝了 PySimpleGUIQt 端口,那么你會(huì)發(fā)現(xiàn) Qt 比 Tkinter 支持更多的開(kāi)箱即用的圖像格式。

      這是圖像查看器最后應(yīng)該是什么樣子的模型:

      這個(gè)例子會(huì)有很多代碼,不過(guò)不用擔(dān)心。之后你會(huì)分成更小的塊來(lái)研究它。

      您可以創(chuàng)建一個(gè)img_viewer.py在您選擇的 Python 編輯器中命名的文件。然后添加以下代碼:

      圖像查看器示例的完整源代碼顯示隱藏

      呼!這是相當(dāng)多的代碼行!讓我們一點(diǎn)一點(diǎn)地討論它。

      這是前幾行:

      1# img_viewer.py 2 3import PySimpleGUI as sg 4import os.path 5 6# First the window layout in 2 columns 7 8file_list_column = [ 9 [ 10 sg.Text("Image Folder"), 11 sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"), 12 sg.FolderBrowse(), 13 ], 14 [ 15 sg.Listbox( 16 values=[], enable_events=True, size=(40, 20), key="-FILE LIST-" 17 ) 18 ], 19]

      在這里,在第 3 行和第 4 行,您導(dǎo)入PySimpleGUIPython 的os模塊。然后,在第 8 行到第 19 行,您創(chuàng)建一個(gè)元素的嵌套列表,這些元素代表用戶界面的垂直列。這將創(chuàng)建一個(gè)瀏覽按鈕,您將使用該按鈕查找包含圖像的文件夾。

      該key參數(shù)是很重要的。這是您用來(lái)標(biāo)識(shí) GUI 中特定元素的內(nèi)容。對(duì)于In()輸入文本控件,您為其指定身份"-FOLDER-"。稍后您將使用它來(lái)訪問(wèn)元素的內(nèi)容。您可以通過(guò)enable_events參數(shù)為每個(gè)元素打開(kāi)或關(guān)閉事件。

      該Listbox()元素將顯示圖像路徑列表,您可以從中選擇顯示。您可以Listbox()通過(guò)傳入字符串列表來(lái)預(yù)填充值。

      當(dāng)您第一次加載用戶界面時(shí),您希望Listbox()為空,因此您向它傳遞了一個(gè)空列表。你打開(kāi)這個(gè)元素的事件,設(shè)置它的size,然后給它一個(gè)唯一的標(biāo)識(shí)符,就像你對(duì) input 元素所做的那樣。

      現(xiàn)在您可以查看右側(cè)的元素列:

      21# For now will only show the name of the file that was chosen 22image_viewer_column = [ 23 [sg.Text("Choose an image from list on left:")], 24 [sg.Text(size=(40, 1), key="-TOUT-")], 25 [sg.Image(key="-IMAGE-")], 26]

      第22 到 26 行的列表創(chuàng)建了三個(gè)元素。第一個(gè)元素告訴用戶他們應(yīng)該選擇要顯示的圖像。第二個(gè)元素顯示所選文件的名稱。第三個(gè)顯示Image().

      請(qǐng)注意,該Image()元素也有一個(gè)key集合,因此您以后可以輕松地引用該元素。有關(guān)該Image()元素的更多信息,請(qǐng)查看文檔。

      下一段代碼定義了您的布局:

      28# ----- Full layout ----- 29layout = [ 30 [ 31 sg.Column(file_list_column), 32 sg.VSeperator(), 33 sg.Column(image_viewer_column), 34 ] 35]

      最后一個(gè)列表位于第 29 到 35 行,包含控制元素在屏幕上的布局方式的代碼。此代碼包含兩個(gè)Column()元素,VSeperator()它們之間有 。VSeperator()是 的別名VerticalSeparator()。您可以通過(guò)閱讀它們各自的文檔頁(yè)面來(lái)了解有關(guān)如何Column()和VSeperator()工作的更多信息。

      要添加layout到您的window,您可以執(zhí)行以下操作:

      37window = sg.Window("Image Viewer", layout)

      現(xiàn)在您已經(jīng)弄清楚了用戶界面,您可以查看事件循環(huán)代碼。這是第一部分:

      39while True: 40 event, values = window.read() 41 if event == "Exit" or event == sg.WIN_CLOSED: 42 break

      事件循環(huán)包含程序的邏輯。在這里,您提取事件并values從window.?該event會(huì)是key哪個(gè)元素與用戶交互的字符串。該values?變量包含將元素映射key到值的 Python 字典。例如,如果用戶選擇一個(gè)文件夾,"-FOLDER-"則將映射到該文件夾 路徑。

      該條件語(yǔ)句用來(lái)控制會(huì)發(fā)生什么。如果event等于"Exit"或用戶關(guān)閉了window,則您將跳出循環(huán)。

      現(xiàn)在您可以查看循環(huán)中下一個(gè)條件語(yǔ)句的第一部分:

      44# Folder name was filled in, make a list of files in the folder 45if event == "-FOLDER-": 46 folder = values["-FOLDER-"] 47 try: 48 # Get list of files in folder 49 file_list = os.listdir(folder) 50 except: 51 file_list = [] 52 53 fnames = [ 54 f 55 for f in file_list 56 if os.path.isfile(os.path.join(folder, f)) 57 and f.lower().endswith((".png", ".gif")) 58 ] 59 window["-FILE LIST-"].update(fnames)

      這個(gè)時(shí)候你檢查event對(duì)"-FOLDER-"?key,它指的是In()前面創(chuàng)建的元素。如果該事件存在,那么您就知道用戶選擇了一個(gè)文件夾,您可以使用它os.listdir()來(lái)獲取文件列表。然后將該列表過(guò)濾為僅具有擴(kuò)展名".png"或".gif".

      注意:如前所述,您可以通過(guò)使用 Pillow 或 PySimpleGUIQt 來(lái)避免縮小圖像文件類型的范圍。

      現(xiàn)在你可以看看條件語(yǔ)句的下一部分:

      60elif event == "-FILE LIST-": # A file was chosen from the listbox 61 try: 62 filename = os.path.join( 63 values["-FOLDER-"], values["-FILE LIST-"][0] 64 ) 65 window["-TOUT-"].update(filename) 66 window["-IMAGE-"].update(filename=filename) 67 except: 68 pass

      如果event等于"-FILE LIST-",則您知道用戶在 中選擇了一個(gè)文件Listbox(),并且您想要更新該Image()元素以及在右側(cè)Text()顯示所選元素的元素filename。

      最后一段代碼是你如何結(jié)束程序:

      71window.close()

      當(dāng)用戶按下退出按鈕時(shí),應(yīng)用程序必須關(guān)閉。為此,您可以使用window.close().

      從技術(shù)上講,您可以將這一行從代碼中刪除,Python 仍會(huì)結(jié)束程序,但最好自己清理一下。此外,如果您使用的是 PySimpleGUI 的 Web 端口并且沒(méi)有正確關(guān)閉窗口,那么您最終會(huì)打開(kāi)一個(gè)端口。

      現(xiàn)在運(yùn)行代碼,你應(yīng)該看到這樣的界面:

      您可以使用“瀏覽”按鈕在計(jì)算機(jī)上查找包含圖像的文件夾,以便您可以試用此代碼。或者,您可以將文件路徑復(fù)制并粘貼到Text()元素中。

      查看完圖像后,您就可以學(xué)習(xí)如何將 Matplotlib 與 PySimpleGUI 結(jié)合使用。

      將 Matplotlib 與 PySimpleGUI 集成

      創(chuàng)建圖表是與同事共享信息的好方法。最流行的 Python 繪圖包之一是Matplotlib。Matplotlib 可以創(chuàng)建各種不同的圖形。如果您想了解更多信息,請(qǐng)查看Python Plotting With Matplotlib (Guide)。

      Matplotlib 可以與 PySimpleGUI 集成,因此如果您已經(jīng)知道如何使用 Matplotlib,則可以相當(dāng)輕松地向 GUI 添加圖形。

      如果你沒(méi)有安裝 Matplotlib,那么你可以使用pip:

      $ python -m pip install matplotlib

      對(duì)于此示例,您使用PySimpleGUI 的演示之一。Matplotlib 使用NumPy,因此您也需要安裝它:

      $ python -m pip install numpy

      現(xiàn)在您擁有編寫(xiě)代碼所需的所有部分,您可以創(chuàng)建一個(gè)新文件并將其命名為psg_matplotlib.py.

      演示代碼有點(diǎn)長(zhǎng),因此您可以從以下部分開(kāi)始添加代碼:

      import numpy as np from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import PySimpleGUI as sg import matplotlib fig = matplotlib.figure.Figure(figsize=(5, 4), dpi=100) t = np.arange(0, 3, .01) fig.add_subplot(111).plot(t, 2 * np.sin(2 * np.pi * t))

      這些是使代碼工作所需的導(dǎo)入。此代碼還設(shè)置了 MatplotlibFigure()并使用add_subplot().?有關(guān)更多詳細(xì)信息,您可能需要參考文檔。PySimpleGUIQt 端口目前的工作方式不同,但正在為未來(lái)的版本進(jìn)行處理。

      在 PySimpleGUI 和 Tkinter 中,您都使用Canvas()元素進(jìn)行繪圖。您可以在文檔中閱讀有關(guān)此元素的更多信息。

      現(xiàn)在您可以創(chuàng)建一個(gè)輔助函數(shù)來(lái)在 PySimpleGUI 的Canvas().?一個(gè)輔助功能是重復(fù)的代碼,你不想寫(xiě)多次。看一看:

      matplotlib.use("TkAgg") def draw_figure(canvas, figure): figure_canvas_agg = FigureCanvasTkAgg(figure, canvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side="top", fill="both", expand=1) return figure_canvas_agg

      您將使用figure_canvas_agg.draw()將繪圖繪制到 PySimpleGUI 的Canvas()元素。

      要使用 PySimpleGUI 的Canvas(),您需要將它FigureCanvasTkAgg()與 Matplotlibfigure對(duì)象一起傳入。FigureCanvasTkAgg()來(lái)自 Matplotlib 并被 Tkinter 用于在 PySimpleGUI 中嵌入繪圖。如果您使用 PySimpleGUIQt,這將有所不同。

      最后一步是使用 PySimpleGUI 編寫(xiě)用戶界面:

      # Define the window layout layout = [ [sg.Text("Plot test")], [sg.Canvas(key="-CANVAS-")], [sg.Button("Ok")], ] # Create the form and show it without the plot window = sg.Window( "Matplotlib Single Graph", layout, location=(0, 0), finalize=True, element_justification="center", font="Helvetica 18", ) # Add the plot to the window draw_figure(window["-CANVAS-"].TKCanvas, fig) event, values = window.read() window.close()

      要?jiǎng)?chuàng)建用戶界面,您只需要一個(gè)Text()元素、一個(gè)Canvas()元素和一個(gè)Button()元素。然后您將所有這些添加到 aWindow()并調(diào)用您的draw_figure()輔助函數(shù)來(lái)繪制繪圖。

      此處不需要事件循環(huán),因?yàn)槟粫?huì)與此用戶界面中的元素進(jìn)行交互。

      圖形如下所示:

      還有其他Matplotlib演示包含PySimpleGUI,你應(yīng)該看看。

      現(xiàn)在您可以學(xué)習(xí)如何將 OpenCV 與 PySimpleGUI 結(jié)合使用。

      將 OpenCV 與 PySimpleGUI 集成

      計(jì)算機(jī)視覺(jué)現(xiàn)在是一個(gè)熱門(mén)話題。Python 允許您使用opencv-python 包進(jìn)入計(jì)算機(jī)視覺(jué)領(lǐng)域,它是流行的OpenCV應(yīng)用程序的包裝器。如果您有興趣了解有關(guān)計(jì)算機(jī)視覺(jué)的更多信息,請(qǐng)查看25 行代碼以下的 Python 人臉識(shí)別。

      PySimpleGUI 具有與 OpenCV 庫(kù)直接集成的特點(diǎn)。但是,您首先需要使用pip以下命令安裝 OpenCV?:

      $ python -m pip install opencv-python

      現(xiàn)在您已經(jīng)安裝了 OpenCV,您可以編寫(xiě)一個(gè)有趣的應(yīng)用程序!

      您將查看另一個(gè)使用 OpenCV 和計(jì)算機(jī)網(wǎng)絡(luò)攝像頭的PySimpleGUI 演示。此應(yīng)用程序可讓您實(shí)時(shí)對(duì)視頻應(yīng)用一些常用過(guò)濾器。

      這個(gè)例子的代碼很長(zhǎng),但不用擔(dān)心。稍后將在較小的塊中對(duì)其進(jìn)行解釋。繼續(xù)創(chuàng)建一個(gè)名為的文件psg_opencv.py并添加以下代碼:

      OpenCV 示例的完整源代碼顯示隱藏

      那是一段很長(zhǎng)的代碼!讓我們一次一個(gè)地回顧這個(gè)例子:

      1import PySimpleGUI as sg 2import cv2 3import numpy as np 4 5def main(): 6 sg.theme("LightGreen") 7 8 # Define the window layout 9 layout = [ 10 [sg.Text("OpenCV Demo", size=(60, 1), justification="center")], 11 [sg.Image(filename="", key="-IMAGE-")], 12 [sg.Radio("None", "Radio", True, size=(10, 1))], 13 [ 14 sg.Radio("threshold", "Radio", size=(10, 1), key="-THRESH-"), 15 sg.Slider( 16 (0, 255), 17 128, 18 1, 19 orientation="h", 20 size=(40, 15), 21 key="-THRESH SLIDER-", 22 ), 23 ],

      第 1 行到第 3 行是您需要的 Python 庫(kù)的導(dǎo)入。然后theme在第 6 行設(shè)置。

      下一步,從第 9 行開(kāi)始,為layoutGUI 中的所有元素創(chuàng)建一個(gè)。第一組元素包括一個(gè)Text()元素、一個(gè)Image()元素和一個(gè)Radio()元素。您將Image元素的標(biāo)識(shí)符鍵設(shè)置為"-IMAGE-"。您還嵌套了一個(gè)Radio()元素和一個(gè)Slider()元素,并將它們的標(biāo)識(shí)符鍵分別設(shè)置為"-THRESH-"和"-THRESH SLIDER-"。

      現(xiàn)在,您將向 中添加更多元素layout:

      24[ 25 sg.Radio("canny", "Radio", size=(10, 1), key="-CANNY-"), 26 sg.Slider( 27 (0, 255), 28 128, 29 1, 30 orientation="h", 31 size=(20, 15), 32 key="-CANNY SLIDER A-", 33 ), 34 sg.Slider( 35 (0, 255), 36 128, 37 1, 38 orientation="h", 39 size=(20, 15), 40 key="-CANNY SLIDER B-", 41 ), 42],

      在第 24 行到第 42 行,您添加了另一個(gè)Radio()元素和兩個(gè)Slider()元素,以通過(guò)用戶界面控制Canny 邊緣檢測(cè)。您還可以適當(dāng)?shù)卦O(shè)置標(biāo)識(shí)符。

      現(xiàn)在,您將添加一種模糊圖像的方法:

      43[ 44 sg.Radio("blur", "Radio", size=(10, 1), key="-BLUR-"), 45 sg.Slider( 46 (1, 11), 47 1, 48 1, 49 orientation="h", 50 size=(40, 15), 51 key="-BLUR SLIDER-", 52 ), 53],

      在這里,您只需要添加幾個(gè)元素來(lái)控制圖像模糊,也稱為圖像平滑。您可以在OpenCV 文檔中閱讀有關(guān)此技術(shù)的更多信息。

      您只需再添加兩組控件。接下來(lái)您將添加色調(diào)控件:

      54[ 55 sg.Radio("hue", "Radio", size=(10, 1), key="-HUE-"), 56 sg.Slider( 57 (0, 225), 58 0, 59 1, 60 orientation="h", 61 size=(40, 15), 62 key="-HUE SLIDER-", 63 ), 64],

      這些元素允許您在不同的色彩空間之間進(jìn)行轉(zhuǎn)換。色彩空間不在本教程的范圍內(nèi),但您可以在 OpenCV 網(wǎng)站上的更改色彩空間教程中閱讀有關(guān)它們的更多信息。

      最后添加的元素用于控制對(duì)比度:

      65 [ 66 sg.Radio("enhance", "Radio", size=(10, 1), key="-ENHANCE-"), 67 sg.Slider( 68 (1, 255), 69 128, 70 1, 71 orientation="h", 72 size=(40, 15), 73 key="-ENHANCE SLIDER-", 74 ), 75 ], 76 [sg.Button("Exit", size=(10, 1))], 77] 78 79# Create the window and show it without the plot 80window = sg.Window("OpenCV Integration", layout, location=(800, 400)) 81 82cap = cv2.VideoCapture(0)

      最后幾個(gè)元素將允許您使用Contrast Limited Adaptive Histogram Equalization算法來(lái)增強(qiáng)視頻流的對(duì)比度。

      這完成了layout.?然后你將你的傳遞layout給 ,Window()這樣你就可以在屏幕上看到你的 UI。

      最后,您使用cv2.VideoCapture(0)訪問(wèn)您機(jī)器上的網(wǎng)絡(luò)攝像頭。您可能會(huì)看到一個(gè)彈出窗口,要求您授予使用相機(jī)的權(quán)限。如果這樣做,則需要授予權(quán)限,否則此代碼將不起作用。

      現(xiàn)在看一下其余的代碼:

      84 while True: 85 event, values = window.read(timeout=20) 86 if event == "Exit" or event == sg.WIN_CLOSED: 87 break 88 89 ret, frame = cap.read() 90 91 if values["-THRESH-"]: 92 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)[:, :, 0] 93 frame = cv2.threshold( 94 frame, values["-THRESH SLIDER-"], 255, cv2.THRESH_BINARY 95 )[1] 96 elif values["-CANNY-"]: 97 frame = cv2.Canny( 98 frame, values["-CANNY SLIDER A-"], values["-CANNY SLIDER B-"] 99 ) 100 elif values["-BLUR-"]: 101 frame = cv2.GaussianBlur(frame, (21, 21), values["-BLUR SLIDER-"]) 102 elif values["-HUE-"]: 103 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 104 frame[:, :, 0] += int(values["-HUE SLIDER-"]) 105 frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR) 106 elif values["-ENHANCE-"]: 107 enh_val = values["-ENHANCE SLIDER-"] / 40 108 clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8)) 109 lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB) 110 lab[:, :, 0] = clahe.apply(lab[:, :, 0]) 111 frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) 112 113 imgbytes = cv2.imencode(".png", frame)[1].tobytes() 114 window["-IMAGE-"].update(data=imgbytes) 115 116 window.close() 117 118main()

      這是 PySimpleGUI 界面的事件循環(huán)。當(dāng)您更改 UI 中的滑塊時(shí),PySimpleGUI 將抓取event和values并使用它們來(lái)確定將哪個(gè) OpenCV 函數(shù)應(yīng)用于您的網(wǎng)絡(luò)攝像頭流。

      這段代碼與您見(jiàn)過(guò)的其他代碼有點(diǎn)不同,因?yàn)樗庋b在一個(gè)main()函數(shù)中。此類函數(shù)用作程序的主要入口點(diǎn)。要了解有關(guān)此主題的更多信息,請(qǐng)查看在 Python 中定義主要函數(shù)。

      這是 GUI 外觀的示例:

      現(xiàn)在是學(xué)習(xí)如何為 Windows 創(chuàng)建應(yīng)用程序的可執(zhí)行文件的時(shí)候了。

      打包適用于 Windows 的 PySimpleGUI 應(yīng)用程序

      有許多不同的Python 包可用于將 Python 代碼轉(zhuǎn)換為適用于 Windows 的可執(zhí)行文件。最受歡迎的一種是PyInstaller。

      您可以使用pip以下命令安裝 PyInstaller?:

      $ python -m pip install pyinstaller

      要了解有關(guān)如何使用 PyInstaller 的更多信息,請(qǐng)查看使用 PyInstaller 輕松分發(fā) Python 應(yīng)用程序。

      您將使用 PyInstaller 將您之前創(chuàng)建的圖像查看器應(yīng)用程序轉(zhuǎn)換為可執(zhí)行文件。

      $ pyinstaller img_viewer.py

      運(yùn)行此命令時(shí),您會(huì)看到很多類似于以下內(nèi)容的輸出:

      177 INFO: PyInstaller: 3.6 178 INFO: Python: 3.8.2 179 INFO: Platform: Windows-10-10.0.10586-SP0 186 INFO: wrote C:\Users\mike\OneDrive\Documents\image_viewer_psg.spec 192 INFO: UPX is not available. 221 INFO: Extending PYTHONPATH with paths ---- output snipped ---- 13476 INFO: Building COLLECT because COLLECT-00.toc is non existent 13479 INFO: Building COLLECT COLLECT-00.toc 25851 INFO: Building COLLECT COLLECT-00.toc completed successfully.

      這個(gè)輸出是縮寫(xiě)的,因?yàn)?PyInstaller 非常冗長(zhǎng)。完成后,您將dist在包含img_viewer.py.?您可以進(jìn)入dist文件夾查找img_viewer.exe并嘗試運(yùn)行它。

      dist可執(zhí)行文件使用的文件夾中會(huì)有很多其他文件。

      如果您更喜歡只有一個(gè)可執(zhí)行文件,那么您可以使用以下--onefile標(biāo)志重新運(yùn)行命令:

      $ pyinstaller --onefile img_viewer.py

      這仍然會(huì)生成dist文件夾,但這次應(yīng)該有一個(gè)可執(zhí)行文件。

      注意:如果您使用該--onefile標(biāo)志,Windows Defender 可能會(huì)將您的可執(zhí)行文件標(biāo)記為有病毒。如果是,則您需要向 Windows 安全中心添加排除項(xiàng)才能使其運(yùn)行。這是因?yàn)?Windows 可執(zhí)行文件需要在 Windows 10 中進(jìn)行簽名。

      當(dāng)您運(yùn)行可執(zhí)行文件時(shí),除了您的用戶界面之外,您還會(huì)看到一個(gè)控制臺(tái)窗口。要?jiǎng)h除控制臺(tái),您可以在運(yùn)行 PyInstaller 時(shí)使用--noconsole或--windowed標(biāo)志。

      結(jié)論

      您在本教程中學(xué)到了很多關(guān)于 PySimpleGUI 包的知識(shí)!最重要的是,您熟悉了使用 PySimpleGUI 創(chuàng)建應(yīng)用程序的基礎(chǔ)知識(shí)。

      在本教程中,您學(xué)習(xí)了如何:

      安裝PySimpleGUI 包

      使用 PySimpleGUI創(chuàng)建基本的用戶界面元素

      使用 PySimpleGUI創(chuàng)建一些應(yīng)用程序,例如圖像查看器

      將 PySimpleGUI 與Matplotlib集成

      在 PySimpleGUI 中使用計(jì)算機(jī)視覺(jué)

      打包適用于Windows的 PySimpleGUI 應(yīng)用程序

      您可以使用在本教程中學(xué)到的知識(shí)來(lái)創(chuàng)建自己的有趣且有用的應(yīng)用程序。

      PySimpleGUI 包提供了更多示例演示,您可以使用它們來(lái)培養(yǎng)技能并發(fā)現(xiàn)如何更有效地使用庫(kù)中的所有工具。請(qǐng)務(wù)必查看它們,您很快就會(huì)發(fā)現(xiàn)自己正在創(chuàng)建自己的跨平臺(tái) GUI 應(yīng)用程序

      GUI Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel2003同時(shí)隱藏行與列的方法
      下一篇:采購(gòu)訂單流程管理文案模板(采購(gòu)訂單流程文件
      相關(guān)文章
      亚洲精品乱码久久久久久V| 亚洲国产区男人本色| 亚洲中文字幕无码专区| 亚洲av无码一区二区三区人妖 | MM131亚洲国产美女久久 | 日韩亚洲翔田千里在线| 亚洲av无码一区二区三区人妖 | 日本亚洲高清乱码中文在线观看| 亚洲AV无码一区二区三区牛牛| 亚洲成AV人综合在线观看| 亚洲成人中文字幕| 亚洲成在人天堂一区二区| 无码乱人伦一区二区亚洲 | 亚洲国产成人精品无码区花野真一| 亚洲日韩精品无码专区| 亚洲熟妇无码八V在线播放| 一本色道久久88—综合亚洲精品| 亚洲免费福利在线视频| 天堂亚洲国产中文在线| 亚洲国产成人手机在线观看| 成人亚洲国产精品久久| 亚洲 无码 在线 专区| 亚洲偷自拍拍综合网| 亚洲无av在线中文字幕| 亚洲成AV人片在WWW色猫咪| 久久久国产精品亚洲一区| 亚洲国产视频一区| 在线观看亚洲AV日韩AV| 蜜臀亚洲AV无码精品国产午夜.| 亚洲AⅤ无码一区二区三区在线 | 国产成人不卡亚洲精品91| 久久精品国产亚洲AV| 亚洲AV网站在线观看| 亚洲午夜福利717| 亚洲av福利无码无一区二区| 亚洲美女大bbbbbbbbb| avtt天堂网手机版亚洲| 亚洲成AV人片在WWW| 亚洲精品偷拍视频免费观看| 亚洲小说区图片区另类春色| 亚洲成人中文字幕|