[PySimpleGUI界面學習](五)窗口響應的返回值是列表還是字典?
- 2020 年 3 月 12 日
- 筆記
回顧
在上一篇文章中我們在最後改進程序時發生了一個意外,即程序在運行時報出了KeyError錯誤,經過仔細檢查,發現在窗口的控件創建時,如果指定了key關鍵字,那麼在引用其返回值時,還用value[0]或value[1]時,就會出錯,在本篇文章中,我們將仔細研究一下,界面窗口對於用戶的點擊在何時採用何種方式來返回。
例子1:返回值為列表(list)
import PySimpleGUI as sg layout = [[sg.Text("姓名"), sg.InputText("浪跡天涯")], [sg.Text("單位"), sg.InputText("天上人間")], [sg.Text("地址"), sg.InputText("四海為家")], [sg.Button("打印")]] window = sg.Window("測試界面返回值的例子").Layout(layout) button, values = window.Read() print(values) print("類型是{}".format(type(values))) window.Close()
界面顯示如下圖所示:

當用戶點擊打印按鈕時,程序將在命令窗口上打印出窗體上輸入控件中的內容,並打印該返回值的類型。
從打印可以看出,此時程序對於用戶的點擊響應返回值為list類型,根據以前學過的知識可以知道,對於list類型中元素的引用需要以其序列來索引,即可以用values[0]、value[1]來獲取。
例子2:返回值為字典(dict)
回顧上一篇文章最後的例子中,我們採用了value["_SHU1_"]、value["_SHU2_"]這樣的形式來獲取用戶的輸入值,這種是典型的字典(dict)引用方式。將上述例子稍做改動,做為例子2:
import PySimpleGUI as sg layout = [[sg.Text("姓名"), sg.InputText("浪跡天涯",key="_NAME_")], [sg.Text("單位",), sg.InputText("天上人間", key="_UNIT_")], [sg.Text("地址"), sg.InputText("四海為家", key="_ADDRESS_")], [sg.Button("打印")]] window = sg.Window("測試界面返回值的例子").Layout(layout) button, values = window.Read() print(values) print("類型是{}".format(type(values))) window.Close()
這段代碼的界面顯示與上一個完全相同,所不同的是打印的結果不一樣:

從上圖的打印結果可以看出,這一次返回值的類型已經變成了字典(dict)類型。
小結
從上面兩個小例子可以看出,當你給程序中的控件指定了關鍵字標識時,界面對用戶行為的返回值是以字典(dict)的形式給出,而當用戶不加任何key關鍵字時,界面對於用戶行為的返回值是列表(list)。
在學習了這麼多之後,有人可能會問,為什麼做一個加法器時,輸入框這麼長呢,能不能縮短一些呢?比如原來竟然是這麼長: 答案當然是可以啦,只需要在創建控件時加入size這個參數即可,於是上一篇最後一個小程序可修改為:
import PySimpleGUI as sg layout = [[sg.Text("加法器")], [sg.InputText(size=(10,1),do_not_clear=True, key="_SHU1_"), sg.Text("+"), sg.InputText(size=(10,1), do_not_clear=True, key="_SHU2_"),sg.Text("="), sg.Text("", key="_RESULT_")], [sg.Button("計算"),sg.Button("清空"), sg.Button("退出")]] window = sg.Window("加法器").Layout(layout) while True: button, values = window.Read() if button is None or button == "退出": break elif button=="清空": window.FindElement("_SHU1_").Update("") window.FindElement("_SHU2_").Update("") window.FindElement("_RESULT_").Update("") else: tmp_a = eval(values["_SHU1_"]) tmp_b = eval(values["_SHU2_"]) tmp_result = tmp_a+tmp_b window.FindElement("_RESULT_").Update(str(tmp_result)) window.Close()
運行結果如圖所示:
