[PySimpleGUI界面学习](三)创建一个持续性窗口(Persistent window)

  • 2020 年 3 月 13 日
  • 筆記

回顾

在上一次文章中说到,在PySimpleGUI这个工具包中,窗口有两类,一类是一次性获取用户输入,另一类就是今天要谈到的持续性窗口,从上一次文章中分析可知,一次性窗口最大的特点是在用户点击某个按钮之后,程序只有一次读取机会,而用户的这一次点击即触发了该次读取,于是界面便不再接收用户输入信息了,即用户在事实上已经无法对该界面进行任何操作,除了将其关闭。

探讨

那么解决持续性窗口的核心问题就在于要创建一个无穷的循环,不断来读取用户的输入行为,直到用户明确发出结束指令方才退出界面,这是一种可行的解决方法。

下面先来体验一下如何将上一篇中那个简单的一次性窗口改造成持续性窗口。

import PySimpleGUI as sg  layout = [ [sg.Text('输入你的名字'), sg.InputText()],  [sg.OK()] ]  window = sg.Window('我的第二个GUI窗口').Layout(layout)  while True:      button, values = window.Read()      if values[0] == "退出":          break      else:          print(values[0])  window.Close()

上述代码将原来的窗口读取语句windows.Read()放在了一个死循环之中,只有当用户在输入框中明确输入一个退出词语时,窗口才会关闭,否则程序直接在控制台上打印用户输入的字符串。

如果你将上述代码粘帖在ipython命令窗口进行运行,即可得到如下图所示的样子:

如果要退出窗口,只需要在文本输入框中输入退出两个字,再点击OK按钮即可使界面消失关闭。

分析

从上面的小程序可以看出,当用户每一次点击OK按钮时,都会触发一次界面读写事件,于是在while True的死循环中就会循环一次,之后程序将停留在Read语句上,等待着用户的下一次输入。

可能聪明的读者这时候会有质疑:为什么这里的这个死循环和以前学习的Python中死循环不一样呢?在普通的Python程序中,一旦进入死循环,程序立刻进入一种死的状态,即不再理会之后的程序而是疯狂地在循环中狂奔而无法逃逸,但这里的死循环却可以停在一个语句上,岂不是很奇怪吗?

的确,这是另一个小秘密,界面编程的本质就是等待用户输入指令从而执行,而这个等待的本身就是一个死循环,事实上,就操作系统本身而言,只要开机指令下达,即进入一个死循环,只是这种所谓的死循环是不断侦测用户的输入,而对于我们这个小程序而言,Read语句的功能就是以刚才所创建的界面来侦测用户的行为,这种侦测是一种对用户行为的响应,我们通常用一个名词交互来对这种行为进行描述。

所以,在界面编程中,和传统的命令行编程有一些类似的地方,比如命令行中也有等待用户输入的命令input(),如果将该命令也包含在while True的循环之中,同样可以使得每一次循环都要在此语句上停留,以等待用户输入。

界面编程,是将用户的交互行为进行扩展,扩展到鼠标、键盘、声音、触摸等等方式都可以与程序进行交互,是对人类更容易操控计算机的一种改进。

小结

这一篇简单介绍了持续性窗口的写法,再来回顾一下创建一个界面的步骤:

  • 第一步:导入PySimpleGUI
  • 第二步:创建界面元素列表,该列表是嵌套的,其每一个子列表表明一行元素排列
  • 第三步:用Window函数创建界面,并用其Layout接口将刚创建的界面元素放置在界面上(此时并没有显示任何界面)
  • 第四步:调用窗口的Read方法,显示界面接收输入 第五步:针对用户的行为,进行各种处理

实战

根据上面两次教程内容,创建一个简易加法器界面:

import PySimpleGUI as sg  layout = [[sg.Text("加法器")], [sg.InputText(), sg.Text("+"), sg.InputText(),sg.Text("=")], [sg.Button("计算"), sg.Button("退出")]]  window = sg.Window("加法器").Layout(layout)  while True:      button, values = window.Read()      if button is None or button == "退出":          break      else:          tmp_a = values[0]          tmp_b = values[1]          print("%s与%s和是%s" % (tmp_a, tmp_b, eval(tmp_a)+eval(tmp_b)))  window.Close()

这里的编码有些错误,我先不予以更正~

这个小程序可以获取用户在两个InputText控件中的输入值,并对这两个数进行求和运算,只不过是将结果打印在命令行。

读者觉得正常是应该将结果显示在用户界面上才对啊,嘿,不要着急,下一次文章就是要用一个小小的魔法将这个结果显示到界面上去。