Python GUI教程(十):创建一个复杂的GUI

本篇概要

  • 构建一个更加复制的GUI
  • 在选项卡部件中应用多个层级
  • 添加一个树部件和一个日历部件
  • 使用一个刻度盘部件来控制一个LCD显示器部件上的数字
  • 连接刻度盘部件和LCD部件到一个单选按钮上
  • 使用一个单选按钮来更新进度栏部件

延续上一篇的解耦思想,我们使用Qt设计师创建一个基本的包含各个部件的图形窗口,再在逻辑代码中对图形窗口进行调用和操作。

创建一个复杂的GUI

我们使用Qt设计师创建一个稍显复杂的GUI。其中包括:

  • 两个选项卡TabWidgets
  • 两个子选项卡TabWidgets
  • 一个日期部件DateEdit
  • 一个日历部件CalendarWidget
  • 一个树形部件TreeWidget
  • 一个组盒子GroupBox
  • 三个单选按钮RadioButton
  • 一个字体选择盒子FontComboBox
  • 一个Lable标签
  • 一个进度条progressBar
  • 一个刻度盘Dial
  • 一个LCD数据显示器LcdNumber

所有的步骤通过Qt设计师的拖拽就可以完成。

创建主选项卡

新建一个主窗口,拖拽TabWidget部件到主窗口中:

在选项卡1中创建一个子选项卡

继续使用TabWidget部件,在选项卡1中创建一个子选项卡:

在子选项卡1中添加一个树部件

我们继续使用TreeWidget部件,在刚刚创建的子选项卡1中创建一个树,并添加一些信息:

在子选项卡2中添加日期和日历部件

现在切换到子选项卡2中,我们使用DateEdit部件和CalendarWidget部件,在子选项卡2中添加一个日期修改框和一个日历框,采用垂直布局:

在选项卡2中添加按钮组

选项卡1已经构建好了,现在切换到选项卡2。 我们先使用GroupBox部件在创建一个组部件,然后在其中添加三个PushButton部件:

在选项卡2中添加刻度和LCD部件

我们再在选项卡2中添加一个刻度盘和LCD显示器,放置在一个组部件中:

在选项卡2中添加一个字体选择器

接着,使用FontComboBox部件和Label部件,在选项卡2中添加一个字体选择器和文本显示:

在选项卡2中添加一个进度栏

最后,我们使用ProcessBar部件在选项卡2中添加一个进度栏:

这样就完成了整个GUI的图形界面设计。 接下来,我们创建信号/槽来实现GUI的事件响应。

构建信号/槽

转换UI文件为Python文件

我们首先转换设计好的UI文件为Python文件,按照之前的解耦思想,将界面代码与逻辑代码分离。

转换UI文件后,新建一个Python文件,引入转换为Python代码的GUI窗口:

运行一下,看是否正常:

新建一个逻辑类

为了便于操作,我们创建一个新类MainWindow,将程序的主循环放入其中,其余的逻辑功能以类的方法的方式添加:

实现日历选择同步到日期选择器

我们在选项卡1的子选项卡2中构建了一个日期修改器和一个日历。 我们需要在日历上对日期进行点击的时候,日期修改器上同步显示我们选择的日期。

我们在MainWindow()类中,新建一个update_date()方法,用于设置日期修改器的数值:

再新建一个update_calendar()方法,用于设置点击日历的信号/槽,将其响应到日期修改器上:

完整的代码如下:

这样,我们点击了日历上的一个日期,日期修改器上就会显示我们点击日期。

实现LCD显示器数字跟随刻度盘变化

我们在组合子部件中放置了一个Dial刻度盘和LCDNumber显示器。 我们可以设置LCD显示器上的数字跟随着刻度盘的变化而变化。

同样是创建两个方法:

一个用来设置LCD显示器的数字,一个用来响应刻度盘的信号。

实现按钮控制进度栏

我们在选项卡2中放置了3个单选按钮,和一个进度条,现在我们让单选按钮来控制进度栏的进度。其中,第一个按钮是默认选项,第二个按钮用来重置清零进度栏,第三个按钮用来根据LCD上的数字来更新。

设置第二个按钮清零进度栏,新建一个方法:

设置第三个按钮的功能,新建两个方法:

更新字体选择

我们还在选项卡2中放置了一个字体选择部件和一个label标签部件,我们可以设置选择了某个字体,就显示在label标签上。

这样,一个稍显复杂的GUI就完成了。

下一篇,我们介绍多线程在GUI中的使用。

有什么问题欢迎留言讨论!

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-11-15

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏转载gongluck的CSDN博客

超级强大的vim配置(vimplus)

最近在重新配置Vim,也在GitHub上找了三个star和fork数目很高的方案,在这里分享给大家: https://github.com/amix/vimr...

1.7K8
来自专栏小白安全

关于YUNUCMSv1.0.6 任意文件删除与配置文件写shell-freebuf漏斗社区发布

任意文件删除漏洞 0×00 相关环境 源码信息:YUNUCMSv1.0.6 问题文件: \YUNUCMSv1.0.6\sta...

3579
来自专栏SeanCheney的专栏

《Learning Scrapy》(中文版)第5章 快速构建爬虫一个具有登录功能的爬虫使用JSON APIs和AJAX页面的爬虫在响应间传递参数一个加速30倍的项目爬虫可以抓取Excel文件的爬虫总结

第3章中,我们学习了如何从网页提取信息并存储到Items中。大多数情况都可以用这一章的知识处理。本章,我们要进一步学习抓取流程UR2IM中两个R,Request...

3078
来自专栏vue学习

21、分类详情页之better-scroll实现滚动

主要是better-scroll的一个基本运用,还有一些诸如首页下拉加载之类的运用我们后面用node把服务端写好了再一并解决; 这就是我们分类详情页面静态页面...

832
来自专栏数据科学学习手札

(数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

  接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库...

1144
来自专栏知识分享

二,ESP8266 GPIO和SPI和定时器和串口(基于Lua脚本语言)

我们写lua用这个软件 http://pan.baidu.com/s/1kVN09cr 密码:pfv7 ? 如果点击的时候提示安装,,安装就行,,如果没有提示呢...

2304
来自专栏PHP技术

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php:...

3255
来自专栏从零开始学自动化测试

python接口自动化10-token登录

前言 有些登录不是用cookie来验证的,是用token参数来判断是否登录。 token传参有两种一种是放在请求头里,本质上是跟cookie是一样的,只是换...

3454
来自专栏数据结构笔记

python爬虫系列之 requests: 让 HTTP 服务人类

比想象中要简单的多吧,只要把要访问的网址当作参数传递给requests.get方法,就可以获得所请求的网页。

512
来自专栏白驹过隙

SCons - 简单而强大的项目编译脚本

34510

扫码关注云+社区