pysimplegui之常用元素介紹


 

1文本元素 | T == Txt == Text

2多行文本sg.Multiline('This is what a Multi-line Text Element looks like', size=(45,5))

 

Window.FindElement(key) 縮短為 Window[key]

基本元素。它顯示文本。

layout = [
            [sg.Text('This is what a Text Element looks like')], ] 

簡單的文字

創建稍后將更新的文本元素時,請確保為新文本保留足夠的字符。當創建一個沒有大小參數的文本元素時,它會被創建為完全適合所提供的字符。

快捷鍵功能

TextareTxt和的簡寫函數T

活動 enable_events

如果您設置參數enable_events,那么如果用戶單擊文本,您將收到一個事件。

多行元素

此元素兼作輸入和輸出元素。

layout = [[sg.Multiline('This is what a Multi-line Text Element looks like', size=(45,5))]] 

多行

隨着時間的推移,這個元素已經被擴展了很多。其中兩個更令人興奮的補充是

  • 能夠基於每個字符輸出獨特的文本和背景顏色
  • print允許您輕松地將正常打印的輸出重新路由到多行元素的方法

Multiline.print()調用是使用與調用相同的元素查找技術進行的update。這些查找之一通常出現:

window['-MULTILINE KEY-'] 

要將您的正常打印之一更改為輸出到您的多行元素,您只需將上述查找表達式添加到您的打印語句的前面。

print('My variables are', a, b, c) # a normal print statement window['-MULTILINE KEY-'].print('My variables are', a, b, c) # Routed to your multiline element 

它變得更好......你可以為你的照片添加顏色

# Outputs red text on a yellow background window['-MULTILINE KEY-'].print('My variables are', a, b, c, text_color='red', background_color='yellow') 

重新定義打印

使用此打印功能的另一種方法是重新定義print語句本身。這將允許您完全保留您的代碼。通過添加這行代碼,您的整個程序會將所有打印信息輸出到多行元素。

print = lambda *args, **kwargs: window['-MULTILINE KEY-'].print(*args, **kwargs)

 

3組合元素 | Combo == InputCombo == DropDown == Drop

也稱為下拉列表。唯一需要的參數是選項列表。返回值是與 GUI 上可見內容匹配的字符串。

layout = [[sg.Combo(['choice 1', 'choice 2'])]] 

組合框

4列表框元素

您可以在大多數 GUI 中找到標准列表框。請注意,此元素的返回值將是結果列表,而不是單個結果這是因為用戶可以從列表中選擇超過 1 個項目(如果您設置了正確的模式)。

layout = [[sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(30, 6))]] 

列表框 2


ListBoxes 可以使窗口從 Read 調用中返回。如果設置了標志

enable_events=TURE,則當用戶進行選擇時,讀取立即返回。

如果設置了標志

bind_return_key=TURE,ListBoxes 可能導致讀取返回的另一種方式。如果為 True,則如果用戶在選擇條目時按下返回鍵,則 Read 返回。此外,如果設置了這個標志,如果用戶雙擊一個條目,它將從讀取返回。

5滑塊元素sg.Slider

滑塊有幾個特定於滑塊的設置以及外觀設置。示例包括orientationrange設置。

layout = [[sg.Slider(range=(1,500), default_value=222, size=(20,15), orientation='horizontal', font=('Helvetica', 12))]] 

滑塊

Qt 滑塊

Qt 和 tkinter 滑塊之間有一個重要的區別。在 Qt 上,滑塊值必須是整數,而不是浮點數。如果您希望滑塊從 0.1 變為 1.0,則讓滑塊從 1 變為 10 並除以 10。這是一個簡單的數學運算,沒什么大不了的。處理它....畢竟你是在寫軟件。想必你知道如何做這些事情。;-)

6單選按鈕元素

創建一個分配給一組單選按鈕的單選按鈕。一次只能選擇組中的 1 個按鈕。

layout =  [
    [sg.Radio('My first Radio!', "RADIO1", default=True), sg.Radio('My second radio!', "RADIO1")] ] 

收音機

7復選框元素 | CBox == CB == Check

復選框元素類似於單選按鈕元素。它們返回一個布爾值,指示它們是否被檢查。

layout =  [[sg.Checkbox('My first Checkbox!', default=True), sg.Checkbox('My second Checkbox!')]]
W[KEY].Get得到當前狀態

復選框

8自旋元件

向上/向下微調器控件。有效值作為列表傳入。

layout =  [[sg.Spin([i for i in range(1,11)], initial_value=1), sg.Text('Volume level')]] 

微調器

9圖像元素

圖像可以放在您的窗口中,只要它們是 PNG、GIF、PPM/PGM 格式。無法顯示 JPG,因為 tkinter 並不天真地支持 JPG。如果圖像是 JPG 格式,則可以在調用 PySimpleGUI 之前使用 Python 圖像庫 (PIL) 包將圖像轉換為 PNG。

layout = [
            [sg.Image(r'C:\PySimpleGUI\Logos\PySimpleGUI_Logo_320.png')], ] 

圖片

您可以將動畫 GIF 指定為圖像,並可以通過調用UpdateAnimation令人興奮的東西!

加載動畫

您可以在不設置值的情況下調用該方法time_between_frames,它將顯示一個幀並立即移動到下一幀。這使您能夠進行幀間定時。

10按鈕元素

按鈕是最重要的元素!它們導致大部分動作發生。畢竟,這是一個按鈕,可以讓你離開一個窗口,無論是提交還是取消,所有窗口都包含一個按鈕。唯一的例外是當用戶使用右上角的“X”關閉窗口時,這意味着不涉及任何按鈕。

按鈕類型包括: * 文件夾瀏覽 * 文件瀏覽 * 文件瀏覽 * 文件另存為 * 文件保存 * 關閉窗口(普通按鈕) * 閱讀窗口 * 實時 * 日歷選擇器 * 顏色選擇器

關閉窗口 - 提交、取消、是、否等普通按鈕,不要關閉窗口......他們曾經這樣做過。現在要關閉一個窗口,您需要使用 CloseButton / CButton。

文件夾瀏覽 - 單擊時打開文件夾瀏覽對話框。文件夾瀏覽對話框的結果被寫入窗口的輸入字段之一。

文件瀏覽 - 與文件夾瀏覽相同,但不是選擇文件夾,而是選擇單個文件。

日歷選擇器 - 打開圖形日歷以選擇日期。

顏色選擇器 - 打開顏色選擇器對話框

讀取窗口 - 這是一個窗口按鈕,它將讀取所有輸入字段的快照,但在單擊后不會關閉窗口。

實時 - 這是另一個異步窗口按鈕。釋放按鈕的單擊后會發生正常的按鈕單擊。實時按鈕在按鈕被按住的整個過程中報告一次點擊。

大多數程序將使用快捷鍵調用(提交、取消等)、使窗口保持打開狀態的普通按鈕和單擊時關閉窗口的關閉按鈕的組合。

有時同一個函數有多個名稱。這只是為了讓程序員的工作更快更容易。或者它們是不再使用但保留的舊名稱,以便現有程序不會中斷。

PySimpleGUI 按鈕的 4 個主窗口及其名稱是:

  1. ButtonReadButtonRButtonReadFormButton(使用Button,其他都是老方法)
  2. CloseButton = CButton
  3. RealtimeButton
  4. DummyButton

您會在舊程序中找到長格式名稱。以閱讀按鈕為例。

2018 年 10 月,Button 的定義發生了變化。以前 Button 在單擊時會關閉窗口。它已被更改,因此 Button 調用將使窗口以與 ReadButton 完全相同的方式保持打開狀態。他們現在是同一個電話。為了使窗口能夠使用按鈕關閉,添加了一個新按鈕...CloseButtonCButton

您的 PySimpleGUI 程序很可能只包含Button調用。其他的一般不會在用戶代碼中找到。

最基本的 Button 元素調用是 Button

layout =  [[sg.Button('Ok'), sg.Button('Cancel')]] 

好的 取消 3

你很少會看到這 2 個按鈕是這樣寫的。回想一下,PySimpleGUI 專注於您(這通常直接意味着......減少打字)。因此,上述窗口的代碼通常使用下一節中的快捷方式編寫。

您通常會看到這個而不是調用Button

layout =  [[sg.Ok(), sg.Cancel()]]

實際上Button,實際上是代表您被調用。在幕后,將文本設置為調用sg.Ok並返回結果,然后進入布局。如果您要打印布局,它將看起來與在布局中特別顯示的第一個布局相同。sg.CancelButtonOkCancelButton

TTK 按鈕和 Mac

2019 年增加了對 ttk 按鈕的支持。這解決了無法在 Mac 上更改按鈕顏色的問題。有很多地方可以控制是否使用 ttk 按鈕,無論是在 MAC 還是其他平台上。

TTK 按鈕和 TK 按鈕的操作略有不同。按鈕突出顯示是一種不同。如何同時顯示圖像和文本是另一回事。你現在有了以前沒有的選擇。很高興看到 Mac 用戶終於可以使用顏色主題了。

按鈕元素快捷方式

這些預制按鈕是所有元素中最重要的元素,因為它們被大量使用。它們基本上都做同樣的事情,設置按鈕文本以匹配函數名稱並將參數設置為常用值如果您發現自己經常需要創建自定義按鈕,因為它不在此列表中,請在 GitHub 上發布請求。他們包括:

  • 行ok
  • 提交submit
  • 取消cancer
  • 是的yes
  • 不no
  • 退出exit
  • 退出quit
  • 幫助help
  • 保存save
  • 另存為saveas
  • 打開open    首字母都大寫

“選擇器”按鈕

這些按鈕用於顯示選擇填充到元素中的文件名、日期、顏色等的對話框InputText(或其他一些“目標”......關於目標,請參見下文)

  • 日歷按鈕
  • CalendarButton
  • 顏色選擇按鈕
  • ColorChooserButton
  • 文件瀏覽
  • FileBrowse
  • 文件瀏覽
  • FilesBrowse
  • 文件另存為
  • FileSaveAs
  • 文件夾瀏覽
  • FolderBrowse

關於快捷按鈕的導入說明 在 3.11.0 版本之前,這些按鈕關閉了窗口。從 3.11 開始,他們不會關閉窗口。它們的行為類似於 RButtons(返回按鈕文本並且不關閉窗口)

如果您在關閉窗口時遇到這些按鈕問題,請pip list在命令提示符下鍵入以檢查您安裝的 PySimpleGUI 版本。在 3.11 之前,這些按鈕會關閉您的窗口。

使用舊版本,如果您想要一個不關閉窗口的 Submit() 按鈕,那么您將改為使用 RButton('Submit')。使用新版本,如果您想要一個像已售出的 Submit() 調用那樣關閉窗口的提交按鈕,您可以將其寫為CloseButton('Submit')CButton('Submit')

按鈕目標

FileBrowseFolderBrowseFileSaveAsFilesSaveAs,按鈕CalendarButtonColorChooserButton將值填充到位於窗口上的另一個元素中。目標可以是文本元素或 InputText 元素或按鈕本身。元素的位置由target函數調用中的變量指定。

目標有兩種形式。1. 鍵 2.(行、列)

使用鍵指定的目標將通過使用目標的鍵值來查找其目標元素。這是“首選”方法。

如果使用(行,列)指定目標,則它使用網格系統。GUI 中的行從 0 開始編號。目標可以指定為硬編碼網格項,也可以與按鈕相關。

(row, col) 定位只能定位同一“容器”中的元素。容器是窗口、列和框架元素。位於列內部的文件瀏覽按鈕無法定位該列之外的元素。

target的默認值為(ThisRow, -1)。 ThisRow是一個特殊值,它告訴 GUI 使用與按鈕相同的行。Y 值 -1 表示按鈕左側的字段一值。對於文件或文件夾瀏覽按鈕,大多數情況下,它填充的字段通常位於按鈕的左側。(ThisRow, -1) 表示按鈕左側的元素,在同一行。

如果(None, None)為目標選擇了值,則按鈕本身將保存信息。稍后可以使用按鈕的鍵查詢按鈕的值。

讓我們以這個窗口為例:

文件瀏覽

InputText元素位於 (1,0)... 第 1 行,第 0 列。按鈕Browse位於 (2,0) 位置。按鈕的目標可以是以下任何值:

Target = (1,0) Target = (-1,0) 

整個窗口的代碼可能是:

layout = [[sg.T('Source Folder')], [sg.In()], [sg.FolderBrowse(target=(-1, 0)), sg.OK()]] 

或者如果使用鍵,那么代碼將是:

layout = [[sg.T('Source Folder')], [sg.In(key='input')], [sg.FolderBrowse(target='input'), sg.OK()]] 

看看關鍵方法有多容易?

隱形目標

一個非常方便的技巧是讓你的目標不可見。這將刪除編輯所選值的能力,就像您通常可以使用輸入元素一樣。這是一種讓事物看起來更干凈、更整潔的方法。

保存和打開按鈕

有 4 種不同類型的文件/文件夾打開對話框可用。如果您正在尋找要打開的文件,這FileBrowse就是您想要的。如果要保存文件,SaveAs是按鈕。如果要獲取文件夾名稱,則FolderBrowse使用按鈕。要一次打開多個文件,請使用FilesBrowse按鈕。它將創建一個由';'分隔的文件列表

打開

文件夾

另存為

日歷按鈕

這些按鈕會彈出一個日歷選擇器窗口。所選日期以字符串形式返回。

日歷

顏色選擇器按鈕

這些按鈕會彈出一個標准的顏色選擇器窗口。結果作為元組返回。返回值之一是 RGB 十六進制表示。

顏色

自定義按鈕

並非所有按鈕都是一樣的。關閉窗口的按鈕不同於從窗口返回而不關閉它的按鈕。如果您想定義自己的按鈕,通常會使用 Button Element 來執行此操作Button,它會在單擊時關閉窗口。

layout =  [[sg.Button('My Button')]] 

按鈕

所有按鈕都可以通過更改button_text按鈕調用中的參數來更改其文本。讀取窗口時返回的正是此文本。該文本將告訴您單擊了哪個按鈕。但是,您也可以在按鈕上使用鍵,以便它們是唯一的。如果只使用文本,您將永遠無法在同一個窗口中使用相同文本的 2 個按鈕。

layout =  [[sg.Button('My Button', key='_BUTTON_KEY_')]] 

使用此布局,Window.read()單擊按鈕時從調用返回的事件將是“ _BUTTON_KEY_

按鈕圖像

現在這是許多簡化包中沒有的令人興奮的功能......按鈕上的圖像!借助一些按鈕圖像,您可以制作出非常漂亮的用戶界面。

這是將 tkinter 從“1990 年代的 GUI”轉變為“現代 GUI”的最快和最簡單的方法之一。如果您不喜歡默認按鈕,那么只需帶上您自己的按鈕圖像並使用它們來代替。

您的按鈕圖像需要采用 PNG 或 GIF 格式。當您使用圖像制作按鈕時,請將按鈕背景設置為與背景相同的顏色。您可以通過調用獲取主題的背景顏色theme_background_color()

TRANSPARENT_BUTTON-重要- 這是一個具有誤導性的遺留值。它目前被定義為這個常數值:

TRANSPARENT_BUTTON = ('#F0F0F0', '#F0F0F0') 

如您所見,它只是 2 種灰色的元組。效果是按鈕文本和按鈕背景顏色為特定的灰色陰影。時光倒流,在您更改背景顏色並且所有窗口都為灰色之前,此值有效。但是現在您的按鈕可以使用任何背景顏色,您需要設置按鈕顏色以匹配背景,以便您的按鈕與背景顏色混合。

sg.Button('Restart Song', button_color=(sg.theme_background_color(), sg.theme_background_color()), image_filename=image_restart, image_size=(50, 50), image_subsample=2, border_width=0) 

Button用於按鈕圖像的元素中有幾個參數。

image_filename - Filename of image. Can be a relative path image_data - A Base64 image image_size - Size of image in pixels image_subsample - Amount to divide the size by. 2 means your image will be 1/2 the size. 3 means 1/3 

這是一個使用按鈕圖像制作的示例窗口。

媒體文件播放器

您可以在文件 Demo Media Player 中找到源代碼。這是創建媒體播放器窗口的按鈕調用的樣子

```python sg.Button('Pause', button_color=(sg.theme_background_color(), sg.theme_background_color()), image_filename=image_pause, image_size=(50, 50), image_subsample=2, border_width=0)


Experimentation is sometimes required for these concepts to really sink in and they can vary depending on the underlying GUI framework.

Button Images do work so play with them. You can use PIL to change the size of your images before passing to PySimpleGUI. ### Realtime Buttons Normally buttons are considered "clicked" when the mouse button is let UP after a downward click on the button. What about times when you need to read the raw up/down button values. A classic example for this is a robotic remote control. Building a remote control using a GUI is easy enough. One button for each of the directions is a start. Perhaps something like this: ![robot remote](https://user-images.githubusercontent.com/13696193/44959958-ff9b7000-aec4-11e8-99ea-7450926409be.jpg) This window has 2 button types. There's the normal "Read Button" (Quit) and 4 "Realtime Buttons". Here is the code to make, show and get results from this window: ```python import PySimpleGUI as sg gui_rows = [[sg.Text('Robotics Remote Control')], [sg.T(' ' * 10), sg.RealtimeButton('Forward')], [sg.RealtimeButton('Left'), sg.T(' ' * 15), sg.RealtimeButton('Right')], [sg.T(' ' * 10), sg.RealtimeButton('Reverse')], [sg.T('')], [sg.Quit(button_color=('black', 'orange'))] ] window = sg.Window('Robotics Remote Control', gui_rows) # # Some place later in your code... # You need to perform a Read or Refresh call on your window every now and then or # else it will apprear as if the program has locked up. # # your program's main loop while (True): # This is the code that reads and updates your window event, values = window.read(timeout=50) print(event) if event in ('Quit', sg.WIN_CLOSED): break window.close() # Don't forget to close your window! 

此循環將讀取按鈕值並打印它們。當單擊實時按鈕之一時,調用window.read將返回一個按鈕名稱,該名稱與按下的按鈕上的名稱相匹配,或者如果有一個鍵分配給該按鈕,則返回該鍵。只要按鈕保持按下狀態,它將繼續返回值。釋放后,Read 將返回超時事件,直到再次單擊按鈕。

文件類型FileBrowse&按鈕有一個名為 的SaveAs附加設置file_types此變量用於過濾文件對話框中顯示的文件。此設置的默認值為

FileTypes=(("ALL Files", "*.*"),) 

此代碼生成一個窗口,其中“瀏覽”按鈕僅顯示 .TXT 類型的文件

layout =  [[sg.In() ,sg.FileBrowse(file_types=(("Text Files", "*.txt"),))]] 

注意 - Mac 用戶將無法使用 file_types 參數。tkinter 在 Mac 上有一個錯誤,如果嘗試使用 file_type,程序會崩潰,因此必須刪除該功能。對於那個很抱歉!

ENTER 鍵 ENTER 鍵是windows 數據輸入的重要部分。使用回車鍵快速提交窗口的傳統由來已久。PySimpleGUI 通過將 ENTER 鍵綁定到關閉或讀取窗口的第一個按鈕來實現這一點。

Enter 鍵可以“綁定”到特定按鈕,以便當按下該鍵時,它會導致窗口返回,就像單擊該按鈕一樣。這是使用bind_return_key按鈕調用中的參數完成的。如果窗口上有多個按鈕,則使用類型為關閉窗口或讀取窗口的第一個按鈕。首先是通過掃描窗口確定的,從上到下,從左到右。

11按鈕菜單元素

ButtonMenu 元素產生一種獨特的效果。這是一個按鈕,點擊后會顯示一個菜單。這就像單擊 MenuBar 上的頂級菜單項之一。結果,菜單定義采用來自普通菜單定義的單個菜單條目的格式。一個普通的菜單定義是一個列表列表。該定義是這些列表之一。

 ['Menu', ['&Pause Graph', 'Menu item::optional_key']] 

第一個字符串通常指定菜單欄上顯示的內容。在這種情況下,不使用該值您使用不同的參數button_textparm 設置按鈕的文本。

此元素的一種用途是制作具有彩色背景的“假菜單欄”。普通菜單欄不能更改其背景顏色。ButtonMenus 並非如此。

按鈕菜單

ButtonMenus 的返回值通過返回值字典發送。如果進行了選擇,則會生成一個事件,該事件將等於 ButtonMenu 的鍵值。使用該鍵值來查找用戶選擇的值。這與菜單欄元素的機制相同,但與彈出(右鍵單擊)菜單不同。

12垂直分隔符元素

該元素的用處有限,並且為了完整性而被包括在內。它將在元素之間畫一條線。

當放置在跨多行的列或元素之間時效果最佳。如果在“正常”行上的元素只有 1 行高,那么它將只跨越那一行。

VerticalSeparator(pad=None) 

snag-0129

13水平分隔符元素

在 tkinter 端口 PySimpleGUI 中,沒有HorizontalSeparator元素。一個將作為“存根”添加,以便代碼可移植。它可能不會像StretchElement 那樣做任何事情。

在 PySimpleGUI 中獲得水平線的一種簡單方法是使用Text包含一行下划線的元素

sg.Text('_'*30) # make a horizontal line stretching 30 characters 

14進度條元素

ProgressBar元素用於構建自定義進度條窗口。強烈建議您使用為您提供完整進度表解決方案的 OneLineProgressMeter。進度表不容易使用,因為窗口必須是非阻塞的,而且調試起來很棘手。

進度條添加到代碼中的最簡單OneLineProgressMeter方法是使用API。這由一對函數OneLineProgressMeter和組成OneLineProgressMeterCancel您可以通過使用當前值 = 最大值調用任何進度表來輕松取消它。這會將儀表標記為過期並關閉窗口。您已經看過本自述文件前面介紹的 OneLineProgressMeter 調用。

sg.OneLineProgressMeter('My Meter', i+1, 1000, 'key', 'Optional message') 

的返回值為OneLineProgressMeter: 如果用戶單擊取消按鈕、關閉窗口或 vale 達到最大值,True則儀表更新正確 。False

窗口中的進度表

將進度表與 PySimpleGUI 一起使用的另一種方法是在窗口中構建一個帶有ProgressBar元素的自定義窗口。您需要將窗口作為非阻塞窗口運行。當您准備好更新進度條時,您可以調用元素本身的UpdateBar方法。ProgressBar

import PySimpleGUI as sg # layout the window layout = [[sg.Text('A custom progress meter')], [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')], [sg.Cancel()]] # create the window` window = sg.Window('Custom Progress Meter', layout) progress_bar = window['progressbar'] # loop that would normally do something useful for i in range(1000): # check to see if the cancel button was clicked and exit loop if clicked event, values = window.read(timeout=10) if event == 'Cancel' or event == sg.WIN_CLOSED: break # update bar with loop value +1 so that bar eventually reaches the maximum progress_bar.UpdateBar(i + 1) # done with loop... need to destroy the window as it's still open window.close() 

進度定制

15輸出元件

輸出元素是標准輸出的重定向。

如果您正在尋找一種方法來快速添加在窗口中顯示滾動文本的功能,那么添加Output元素將盡可能快速和簡單。

任何“打印”的內容都將顯示在此元素中。 這是在窗口中顯示滾動文本的“簡單”方式。這就像將一個輸出元素放到您的窗口中然后盡可能多地調用 print 一樣簡單。用戶將在其窗口內看到文本的滾動區域。

重要事項print在您調用window.read 不會看到您window.Refresh如果您想立即查看打印的內容,請window.Refresh()在您的打印語句之后立即調用。

Output(size=(80,20)) 

輸出


這是使用輸出元素的聊天窗口的完整解決方案。要顯示接收到的數據,您只需“打印”它,它就會顯示在輸出區域中。您會發現在包括 HowDoI 應用程序在內的多個演示程序中使用了這種技術。

import PySimpleGUI as sg def ChatBot(): layout = [[(sg.Text('This is where standard out is being routed', size=[40, 1]))], [sg.Output(size=(80, 20))], [sg.Multiline(size=(70, 5), enter_submits=True), sg.Button('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0])), sg.Button('EXIT', button_color=(sg.YELLOWS[0], sg.GREENS[0]))]] window = sg.Window('Chat Window', layout, default_element_size=(30, 2)) # ---===--- Loop taking in user input and using it to query HowDoI web oracle --- # while True: event, value = window.read() if event == 'SEND': print(value) else: break window.close() ChatBot()

使用比例間隔字體(通常是默認字體),即使一組字符的字符數相同,一組字符的像素大小也會不同於另一組字符的像素大小。換句話說,並非所有字母都使用相同數量的像素。看看你現在正在閱讀的文本,你會看到這一點。“i”占用的空間比“A”少。


Window.FindElement(key) 縮短為 Window[key]

在使 PySimpleGUI 代碼更緊湊方面取得了驚人的飛躍。

而不是寫:

window.FindElement(key).update(new_value)
 ```

You can now write it as: ```python window[key].update(new_value) ``` This change has been released to PyPI for PySimpleGUI MANY Thanks is owed to the nngogol that suggested and showed me how to do this. It's an incredible find as have been many of his suggestions. ## `Element.update()` -> `Element()` shortcut This has to be one of the strangest syntactical constructs I've ever written. It is best used in combination with `FindElement` (see prior section on how to shortcut `FindElement`). Normally to change an element, you "find" it, then call its `update` method. The code usually looks like this, as you saw in the previous section: ```python window[key].update(new_value) 

可以通過刪除.update字符來進一步壓縮代碼,從而得到這個看起來非常緊湊的調用:

window[key](new_value)

是的,這是 Python 中的有效語句。

正在發生的事情是元素本身被調用。你也可以這樣寫:

elem = sg.Text('Some text', key='-TEXT-') elem('new text value') 

旁注 - 您也可以window直接調用您的變量。如果您“調用”它,它實際上會調用Window.read.

window = sg.Window(....)
event, values = window()

# is the same as window = sg.Window(....) event, values = window.read() 

但是看起來令人困惑,因此在使用時,最好在語句的末尾寫一個注釋以幫助落后的可憐的初學者程序員。

因為它是一個陌生的結構,上過 1 周 Python 課程的人都認不出來,所以 demo 將繼續使用該.update方法。

它不必與 結合使用FindElement該調用適用於任何先前制作的元素。有時會創建元素並將其存儲到變量中,然后在布局中使用該變量。例如。

graph_element = sg.Graph(...... lots of parms ......)

layout = [[graph_element]]
.
.
.
graph_element(background_color='blue') # this calls Graph.update for the previously defined element 

希望這不會太令人困惑。請注意,這些快捷方式替換的方法不會被刪除。您可以繼續使用舊結構而無需更改。


字體

已經在通用參數部分討論過。字符串或元組。

PySimpleGUI 中的顏色是兩種格式之一 - 顏色名稱或 RGB 值。

使用 tkinter 中定義的顏色名稱或此格式的 RGB 字符串指定單個顏色:

"#RRGGBB" or "darkblue" 

auto_size_text

Trueauto_size_text,當放置在文本元素上時,表示元素的寬度應該縮小為文本的寬度。默認設置為真。Text當您創建用於輸出的元素時,您需要記住這一點。

Text(key='-TXTOUT-)將創建一個Text長度為 0 的元素。請注意,對於具有空字符串的 Text 元素,不需要指定字符串值。字符串的默認值是''文本元素。在發布 4.45.0 之前,您需要為最長的字符串保留足夠的空間。如果您嘗試輸出一個 5 個字符的字符串,它不會顯示在窗口中,因為沒有足夠的空間。補救措施是手動將大小設置為您期望輸出的大小

Text(size=(15,1), key='-TXTOUT-)創建一個Text可以容納 15 個字符的元素。

對於較新的版本,在 4.45.0 之后,如果您根本不設置大小,即size=(None, None),那么Text元素將同時增長和縮小以適應文本,Window此外,如果您指示高度為,None則元素將在其中增長和縮小以匹配字符串。

元素現在的工作方式Text是真正自動調整大小的。

 12

菜單

從 3.01 版開始,您可以將 MenuBar 添加到您的窗口。您指定菜單的方式與使用列表的窗口布局非常相似。從 3.17 開始,菜單選擇作為事件返回,在 values 字典中也是如此。返回的值將是整個菜單項,包括您指定的鍵。

    menu_def = [['File', ['Open', 'Save', 'Exit',]], ['Edit', ['Paste', ['Special', 'Normal',], 'Undo'],], ['Help', 'About...'],] 

菜單

注意 ',' 和 [] 的位置。使嵌套菜單正確實現級聯菜單是很棘手的。看看 paste 后面是如何將 Special 和 Normal 作為列表的。這意味着 Paste 有一個包含 Special 和 Normal 項的級聯菜單。

方法


要將菜單添加到 Window 中,請將MenuorMenuBar元素放入布局中。

layout = [[sg.Menu(menu_def)]] 

將菜單元素放在布局中的哪個位置並不重要,因為它始終位於窗口的頂部。

當用戶選擇一個項目時,它作為事件返回(如果在菜單定義中指定了一個,則與菜單項的鍵一起返回)

按鈕菜單

按鈕菜單是在 3.21 版中引入的,之前已在 PySimpleGUIQt 中發布。它們的工作方式完全相同,並且是 PySimpleGUI 和 PySimpleGUIQt 之間的源代碼兼容。這些類型的菜單采用單個菜單條目,其中菜單欄采用菜單條目列表。

ButtonMenus 的返回值與菜單欄不同。

您將取回 ButtonMenu 的 KEY 作為事件。要選擇實際項目,您將在值字典中查找它。這可以通過表達式來完成values[event]

右鍵菜單

右鍵菜單是在 3.21 版本中引入的。幾乎每個元素都有一個 right_click_menu 參數,並且有一個用於豐富點擊菜單的窗口級設置,它將為窗口中的所有元素附加一個右鍵菜單。

菜單定義與按鈕菜單定義相同,為單個菜單項。

right_click_menu = ['&Right', ['Right', '!&Click', '&Menu', 'E&xit', 'Properties']] 

忽略右鍵菜單和按鈕菜單中的第一個字符串它不被使用。通常,您會將菜單欄上顯示的字符串放在該位置。

右鍵單擊菜單的返回值與 MenuBars 相同。 選擇的值作為事件返回。

您曾在其他 Windows 程序中使用 ALT 鍵來導航菜單。例如 Alt-F+X 退出程序。Alt-F 下拉文件菜單。X 選擇標記為 Exit 的條目。

好消息是 PySimpleGUI 允許您創建相同類型的菜單!你的程序可以和大男孩一起玩。而且,這很簡單。

您只需在要顯示的字母前添加一個“&”,並帶有下划線。當您按住 Alt 鍵時,您將看到帶有您標記的下划線的菜單。

您可以添加的另一點潤色是列表中的分隔符。要在菜單選項列表中添加一行,請創建一個如下所示的菜單條目:'---'

這是一個帶有下划線和分隔符的示例菜單。

# ------ Menu Definition ------ # menu_def = [['&File', ['&Open', '&Save', '---', 'Properties', 'E&xit' ]], ['&Edit', ['Paste', ['Special', 'Normal',], 'Undo'],], ['&Help', '&About...'],] 

這是它制作的精美菜單: 帶有快捷方式的菜單

禁用的菜單項

如果您希望禁用其中一個菜單項,請放置一個“!” 在菜單項的前面。要禁用前面示例中的粘貼菜單條目,該條目將是: ['!&Edit', ['Paste', ['Special', 'Normal',], 'Undo'],]

如果您想從“!”更改禁用的菜單項標志/字符 換成別的東西,改變變量MENU_DISABLED_CHARACTER

菜單鍵

從 3.17 版開始,您可以將 a 添加key到您的菜單條目中。key值將在插入菜單之前被刪除。當您接收到 Menu 事件時,將返回整個菜單項,包括key::通過在菜單條目后添加一個鍵來表示一個鍵,然后是鍵。

要添加key _MY_KEY_到特殊菜單條目,代碼將是:

['&Edit', ['Paste', ['Special::_MY_KEY_', 'Normal',], 'Undo'],]

如果要將指示鍵后跟的字符從 '::' 更改為其他字符,請更改變量 MENU_KEY_SEPARATOR

菜單定義

通讀菜單部分后,您可能已經注意到右鍵菜單和按鈕菜單的格式有點奇怪,因為其中有一部分沒有被使用(第一個字符串)。也許“未使用”這個詞應該出現在示例中......但是,有理由保留那些有意義的詞。

這樣做的原因是架構上的,但它也給用戶帶來了方便。您可以將單個菜單項(按鈕和右鍵單擊)放入列表中,您將擁有一個菜單欄定義。

這可以從一系列這些單獨的菜單定義中創建一個菜單欄:

menu_bar = [right_click_menu_1, right_click_menu_2, button_menu_def ]

當然,方向也相反。您可以使用菜單欄定義並拉出單個菜單項以創建右鍵單擊或按鈕菜單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM