pyqt 主程序运行中处理其他事件(多线程的一种代替方式)
一、实验环境
1.Windows7x64_SP1
2.Anaconda2.5.0 + python2.7(anaconda集成,不需单独安装)
3.pyinstaller3.0
4.通过Anaconda Navigator安装pyqt5
二、背景如下
2.1 程序要求
单击“Ping_Test”按钮后,按钮文本变换为“Waitting...”,同时TextEdit控件中显示“ping测试中,请等待...”,ping动作完成后,TextEdit控件中显示ping的结果。

2.2 代码实现
代码全部放在ping函数中,函数代码不再给出
self.ui.ping_test.clicked.connect(self.ping)
2.3 产生问题
运行程序发现,未能实现2.1的预期要求,按下按钮,ping动作完成后,“Ping_Test”按钮才显示“Waitting...”;另外“TextEdit”控件未显示“ping测试中,请等待...”,直接显示ping的结果
2.4 原因分析
按钮按下之后,未执行窗口重绘,准确来说未处理控件文本改变事件,ping动作之后一并处理。
三、实现步骤
3.1 实现方式一
鼠标单击动作分为两种,pressed和clicked,前者为鼠标左键按下,后者为鼠标左键按下并释放。代码实现如下:
self.ui.ping_test.pressed.connect(self.ping_change_text)
self.ui.ping_test.clicked.connect(self.ping)
def ping_change_text(self):
self.ui.ping_test.setText('Waitting...')
self.ui.textEdit.setText('ping测试中,请等待...') def ping(self):
self.ui.ping_test.setEnabled(False)
self.debug_print('ping test')
smartbit_ip = self.ui.ip_list.currentText()
if smartbit_ip:
QApplication.processEvents()
ret_ping = os.popen('ping %s -w 3' %(smartbit_ip)).read()
if '100%' in ret_ping:
self.ui.get_user.setEnabled(False)
self.ui.textEdit.setText('ping测试失败,请确认网络连接或者仪器是否正常')
else:
self.ui.get_user.setEnabled(True)
self.ui.textEdit.setText('ping测试成功,请按下Get_User按钮')
else:
self.ui.textEdit.setText('SmartBit IP地址为空!')
self.ui.ping_test.setEnabled(True)
self.ui.ping_test.setText('Ping_Test')
3.2 实现方式二,推荐该方式
使用QApplication.processEvents函数,使该函数调用前面事件优先执行。代码如下
from PyQt5.QtWidgets import QApplication,QDialog self.ui.ping_test.clicked.connect(self.ping)
def ping(self):
self.ui.ping_test.setText('Waitting...')
self.ui.textEdit.setText('ping测试中,请等待...')
self.ui.ping_test.setEnabled(False)
self.debug_print('ping test')
QApplication.processEvents()
smartbit_ip = self.ui.ip_list.currentText()
if smartbit_ip:
QApplication.processEvents()
ret_ping = os.popen('ping %s -w 3' %(smartbit_ip)).read()
if '100%' in ret_ping:
self.ui.get_user.setEnabled(False)
self.ui.textEdit.setText('ping测试失败,请确认网络连接或者仪器是否正常')
else:
self.ui.get_user.setEnabled(True)
self.ui.textEdit.setText('ping测试成功,请按下Get_User按钮')
else:
self.ui.textEdit.setText('SmartBit IP地址为空!')
self.ui.ping_test.setEnabled(True)
self.ui.ping_test.setText('Ping_Test')
pyqt 主程序运行中处理其他事件(多线程的一种代替方式)的更多相关文章
- Java多线程的三种实现方式
java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...
- java多线程的几种实现方式
java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...
- 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- spring事务——try{...}catch{...}中事务不回滚的几种处理方式(转载)
转载自 spring事务——try{...}catch{...}中事务不回滚的几种处理方式 当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @Respon ...
- 中央事件总线 事件驱动架构(EDA) 解析事件总线的4种实现方式
事件驱动架构(EDA)https://mp.weixin.qq.com/s/nA8XFD2Rx_7qA_LxltGGHw https://mp.weixin.qq.com/s/cD3auglgKzOb ...
- 阿里巴巴--java多线程的两种实现方式,以及二者的区别
阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...
- Java事件监听器的四种实现方式
自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...
- Android点击事件通过kotlin几种实现方式总结
一般来说,Android点击事件通过kotlin有以下几种实现方式: 1.通过全局接口View.OnClickListener实现,代码如下 //class MainActivity : AppCom ...
- 二、spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍
包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc ...
随机推荐
- PNG透明窗体全攻略(控件不透明)
http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...
- excel导入到数据库的异常处理
excel导入到数据库,这个是经常发生的,今天就碰到了一个非常郁闷的事情,在导入到oracle数据的时候,总是出现ORA-01756: 引号内的字符串没有正确结束,认真的排插了数据当中可能出现的错误, ...
- Win8下安装MAC OS
参考: win7下安装OSX10.8及XCODE4.5 http://cleris.diandian.com/VB-Mountain-Lion 1,本机环境: win8 64位, 8G内存. ...
- Kafka Topic的详细信息 捎带主要的安装步骤
1. 安装步骤 Kafka伪分布式安装的思路跟Zookeeper的伪分布式安装思路完全一样,不过比Zookeeper稍微简单些(不需要创建myid文件), 主要是针对每个Kafka服务器配置一个单独的 ...
- 安装Cloudera Impala
安装Cloudera Impala Cloudera Impala是Cloudera Enterprise Core的开源扩展,用于快速返回查询结果. Impala作为你环境的插件,与其他组件的安装独 ...
- Spring的Bean的生命周期
一:生命周期执行的过程如下:1) spring对bean进行实例化,默认bean是单例.2) spring对bean进行依赖注入.3) 如果bean实现了BeanNameAware接口,spring将 ...
- spark 源码分析之二 -- SparkContext 的初始化过程
创建或使用现有Session 从Spark 2.0 开始,引入了 SparkSession的概念,创建或使用已有的session 代码如下: val spark = SparkSession .bui ...
- Junit4使用详解一:测试失败的两种情况
Junit4最佳实践 1.把测试文件夹和代码文件夹分离,这两者的代码互不干扰,代码目录和测试目录是并列的关系 2.Java代码 3.创建单元测试代码文件 4.运行测试代码 5.查看测试结果 现在的情 ...
- .NET架构开发应知应会
.NET程序是基于.NET framework..NET Core.Mono.UWP[.NET实现]开发和运行的 ,定义以上[.NET实现]的标准规范称为.NET Standard L1:.NET S ...
- C#版剑指Offer-001二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...