专栏首页王荣胜的专栏文章分享[PySimpleGUI界面学习](三)创建一个持续性窗口(Persistent window)

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

回顾

在上一次文章中说到,在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控件中的输入值,并对这两个数进行求和运算,只不过是将结果打印在命令行。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PySimpleGUI界面学习](一)安装及简单说明

    # 一、界面编程到底是什么? 关于程序设计,有太多的书来描述,那么界面编程又是什么东西呢? 当你学习完一本程序设计的书本时,一般情况下都学会了某个编程语言的...

    王荣胜
  • [PySimpleGUI界面学习](二)一个简单程序的分析

    在上一篇文章中简单介绍了PySimpleGUI这个工具包,在结束的时候给出一个简单的例子,这个例子展示了一个简单的窗口,虽然只有短短五行代码,但是已经将如何创建...

    王荣胜
  • Python为什么成为人工智能的首选语言

    之前一直都是在学习Python与机器学习,深度学习。但是究竟为什么在众多的编程语言中选择Python作为人工智能的首选语言呢我一直不得而知,今天就来以我的理解来...

    王荣胜
  • Python爬虫入门教程 30-100 高考派大学数据抓取 scrapy

    终于写到了scrapy爬虫框架了,这个框架可以说是python爬虫框架里面出镜率最高的一个了,我们接下来重点研究一下它的使用规则。

    梦想橡皮擦
  • Python基础数据类型

    配置好我们的 Python 环境后,我们就可以正式开启 Python 学习之旅了。之前我不止一次说过二八定律(学习 20% 的重要知识,解决 80% 的问题),...

    罗罗攀
  • 社区指标:数字背后的挑战[Openstack]

    我们都痴迷于生活中可以衡量的数字和统计数据。我们关心我们的健康,所以我们监测我们的体重、血压和卡路里摄入量。我们也观察我们自己和我们的工作环境来评估我们的效率和...

    用户6667850
  • WinForm多语言版本实战项目演练

    跟着阿笨一起玩NET
  • 李彦宏:AI模仿人脑是走不通的

    人工智能(Artificial Intelligence)并不是一个新的概念,它实际上诞生于 20 世纪 50 年代。作为一门前沿交叉学科,人工智能一直没有统一...

    AI科技大本营
  • 百度 | 李彦宏:AI模仿人脑是走不通的

    人工智能(Artificial Intelligence)并不是一个新的概念,它实际上诞生于 20 世纪 50 年代。作为一门前沿交叉学科,人工智能一直没有统一...

    昱良
  • AMD Zen之父跳槽Intel:推进10nm工艺

    Jim Keller堪称微处理器行业的传奇人物,多年来转战AMD、苹果、特斯拉,设计了众多优秀的CPU架构,尤其是K7/K8、Zen架构两度帮助AMD崛起,苹果...

    Debian社区

扫码关注云+社区

领取腾讯云代金券