不管是手机电脑,还是带触摸屏的终端设备,简单易用的图形界面,总是很受欢迎。
而提起Python下的图形界面开发,大家一定都会想到 PyQt 和 wxPython、Kivy 等经典模块。
不过我们这次要介绍的“guizero”,是一个非常易用的GUI库,能让初学者快速、轻松地为他们的程序创建图形界面。
安装很简单:
pip3 install guizero
这里先来个基础的例子。
from guizero import App, Text, PushButton app = App(title="IoT前哨站") intro = Text(app, text="试着用guizeo开发图形界面") ok = PushButton(app, text="Ok") app.display()
这个例子应该很容易懂,先设置窗体、标题,然后放入一个文本框和一个按钮。
由于文本框没有设置内容,所以不太看得出来,整个窗体只能发现一个按钮孤零零的杵那儿。
下面我们试着给按钮加功能,让它做一个显示字符的操作(准备让文本框发挥作用了)。
from guizero import App, Text, PushButton def say_hello(): text.value = "欢迎关注IoT前哨站" from guizero import App, Text, PushButton app = App() text = Text(app) button = PushButton(app, command=say_hello) app.display()
当你单击 Button 按钮时,原本空着的文本框会显示“欢迎关注IoT前哨站”。
如果你的程序功能比较复杂,需要另外一个窗体展示内容的时候……
from guizero import App, Window, Text app = App(title="主窗体") window = Window(app, title="第二窗体") text = Text(window, text="这段文字将在第二窗体显示") app.display()
默认情况下,guizero是自动布局,或者通过修改窗体内各部件的align属性,来调整它们的基本方位,但那肯定不够。
更细致一点的布局方式 —— 网格。
from guizero import App, PushButton app = App(title="IoT前哨站",layout="grid") button1 = PushButton(app, text="1", grid=[0,0]) button2 = PushButton(app, text="2", grid=[1,0]) button3 = PushButton(app, text="3", grid=[2,0]) button4 = PushButton(app, text="4", grid=[0,1]) button5 = PushButton(app, text="5", grid=[1,1]) button6 = PushButton(app, text="6", grid=[2,1]) button7 = PushButton(app, text="7", grid=[0,2]) button8 = PushButton(app, text="8", grid=[1,2]) button9 = PushButton(app, text="9", grid=[2,2]) button0 = PushButton(app, text="0", grid=[1,3]) app.display()
通过grid参数来修改各部件的[x,y]坐标,以此改变它们在窗体中出现的位置。
你也可以通过在网格参数中指定范围,使部件跨越多个列或行。这些都是可选的,但必须用[x,y,xspan,yspan]这样的格式来指定它们。
比如下面这个图片摆放的例子。
from guizero import App, Picture app = App(title="IoT前哨站",layout="grid") picture1 = Picture(app, image="Debian.jpg", grid=[0,0]) picture2 = Picture(app, image="IotOutpost.jpg", grid=[1,0]) picture3 = Picture(app, image="wide.jpg", grid=[0,1,2,1]) picture4 = Picture(app, image="tall.jpg", grid=[2,0,2,2]) app.display()
弹出框大家也经常在用,一般经典的就是询问、提示和警告。
from guizero import App app = App(title="月饼提问") build_a_snowman = app.yesno("问题", "你喜欢吃蛋黄月饼吗?") if build_a_snowman == True: app.info("月饼", "这就给你拿一块过来。") else: app.error("月饼", "好吧,那就不吃了。") app.display()
再看一个经典的滑动条,假设要调整空调的温度。
from guizero import App, PushButton, Slider app = App(title="空调操作") button = PushButton(app, text="开/关",width=30, height=5) slider = Slider(app, width=200, height=30) app.display()
下面来一个读取传感器数值并每秒钟刷新的例子。当然,为了方便演示,里面用的是随机数。
from guizero import * import random def read_sensor(): return random.randrange(3200, 5310, 10) / 100 def update_label(): text.value = read_sensor() # recursive call text.after(1000, update_label) if name == 'main': app = App(title='Sensor Display!', height=100, width=200, layout='grid') title = Text(app, 'Sensor value:', grid=[0, 0]) text = Text(app, "xx", grid=[1, 0]) text.after(1000, update_label) app.display()
最后,来一个带菜单选项的例子。
from guizero import * def switch_screen(switch_to): hide_all() switch_to.show() def hide_all(): for screen in all_screens: screen.hide() app = App("多选择框运用", layout="grid") all_screens = [] 创建一个菜单区域 menu = Box(app, grid=[0,0], layout="grid") menu.tk.width = 900 menu.bg = "gray" 选项1 option1 = Box(app, grid=[1,0]) text1 = Text(option1, text="这是列表区的内容") combo = Combo(option1, options=["树莓派","小熊派","香橙派"]) all_screens.append(option1) 选项2 option2 = Box(app, grid=[1,0]) text2 = Text(option2, text="这是滑动框") slider = Slider(option2) all_screens.append(option2) option1_button = PushButton(menu, text="列表区", \ command=switch_screen, args=[option1], grid=[0,0], align="left") option2_button = PushButton(menu, text="滑动框", \ command=switch_screen, args=[option2], grid=[0,1], align="left") hide_all() all_screens[0].show() app.display()
左侧灰色的两个菜单选项,分别是“列表区”和“滑动框”,单击任意一个按钮后会出现相应内容,列表区中有个下拉式清单,而滑动框点进去是与其对应的部件。
其他的用法大家可以继续挖掘,不管你的系统是 Windows 还是 Mac、Raspbian Linux,Guizero均可支持。
虽然看着似乎有一点糙,但好在上手快。哪怕你是一个刚开始研究图形界面的 Python 开发者,也能轻松掌握。
作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。