项目目标
- 实现一个 one-shot 窗口,(完成)
- 使用 Input 组件读取用户姓名,
- 使用 Popup 组件提示欢迎信息。
你也可以在线运行 demo
https://repl.it/@alvendarthy/PySimpleGUIDemo2
回顾
上一节,我们已经在 https://repl.it/ 中编辑代码,成功运行了第一个视窗:
为了方便,之后我将直接截取右上角的视窗:
项目目标的第一步成功搞定,下来实现目标中的 2、3,让它更加完善。
开始
获得用户输入
视窗通过 window.read() 来获取用户输入,这个函数会一直阻塞在这里,直到用户触发按钮。
如果希望 windows.read() 不阻塞的话,可以为 read 函数指定 timeout 参数,如果一定时间内用户没有输入,read 函数就会返回。 除非你有一定的编程经验,否则 timeout 不应当被设定为 0,这可能让你的程序进入死循环。
让我们增加一点代码,检查一下 window.read() 的返回值。
import PySimpleGUI as sg
layout = [ [sg.Text("Name"), sg.Input()], [sg.Button("OK")] ]
window = sg.Window("Hello App", layout)
ret = window.read()
print(ret)
向输入框中输入 i love python,在命令行中看到
('OK', {0: 'i love python'})
可以看到 ret[1][0] 就是输入框中的文字。
window.read() 返回一个 tuple,包含两个元素:
- 触发 window.read() 的组件名称,对于 Button 可能是按钮上的文字,如果创建 Button 实例的时候指定了 key,就是这个 key。通常称之为 event。
- 一个字典,包含此时所有可输入控件的值。未指定 key 的控件会自动从 0 开始索引,否则将以各控件的 key 为索引。通常称之为 values。
目前的视窗中
- 只包含一个按钮:Button,且没有指定 key,因此 event 就是按钮的文字 “OK”;
- 只包含一个可输入组件:Input,且没有指定 key,values 字典中的索引是 0。
视窗中的组件会越来越多,所以最好为组件命名,在实例化的时候传入参数 key 即可。
import PySimpleGUI as sg
# Input 增加了参数 key
layout = [ [sg.Text("Name"), sg.Input(key="-NAME-")], [sg.Button("OK", key="-OK-")] ]
window = sg.Window("Hello App", layout)
ret = window.read()
print(ret)
输出:
('-OK-', {'-NAME-': 'i love python'})
event 是 OK 按钮的 key: “-NAME-”, values 字典中的索引变成了输入框的 key: "-NAME-"。输入框的信息已经可以正确获取了!
最后一步,弹窗提示
PySimpleGUI 已经提供了弹窗对象 Popup,弹窗对象是一次性的,只需要指定弹窗显示的字符串即可,如果有多行信息,可以作为多个参数传入。希望你还记得字符串拼接方法,以便显示形如 “欢迎 xxx!” 的信息。
import PySimpleGUI as sg
layout = [ [sg.Text("Name"), sg.Input(key="-NAME-")], [sg.Button("OK", key="-OK-")] ]
# 阻塞,直到用户点击按钮才返回
window = sg.Window("Hello App", layout)
# window.read() 返回的是 tuple,这里直接将 tuple 解包为 event 和 values 备用
event, values = window.read()
# 拼接字符串, 我刚发现这款 online IDE 不支持中文
info = "Welcome " + values["-NAME-"]
# 弹窗,演示多行信息
sg.Popup(info, "one more line", "another line")
# 最后,关闭 windows 是个好习惯
window.close()
顺利实现了弹窗:
总结
只用了不到 10 行,实现了一个典型的视窗程序,体验已经比单纯的脚本高到不知哪里去了。
你可以试试,如果多次使用 Popup 创建弹窗,会怎样呢?
明天做点什么呢,天儿冷了,写个查询天气的小工具,怎么样!?
我们会用到:
- requests 库
- json 库
- 对 HTTP 协议有一点了解就更好了!
明天见咯!
我是你忘不了的智慧
字符串的拼接
# 以下方法效果相同 result = str1 + str2 result = "{}{}".format(str1, str2) result = "".join([str1, str2]) result = "%s%s" % (str1, str2)
然而,字符串拼接时,并不是真的在 str1 后追加 str2。Python 中 String 是不可变对象。那字符串是怎么修改的呢?很简单——Python 重新创建字符串,内容是新的字符串值。 当 str1 = "hello" 时:
随后 str1 = "hello1",原来的 "hello" 会直接被抛弃,Python 会创建新的 String 对象,值是 “hello1”,与原来的 “hello” 毫无关系!随后的某个时候,“hello” 所占有的内存会被垃圾回收机制(GC)释放。 同样的,执行完 str1 和 str2 的拼接后,result 保存的是全新创建的 String 对象 “helloworld”,str1 和 str2 的值则不会受影响。