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

运行结果如图所示: