[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()

運行結果如圖所示: