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 ...
随机推荐
- C++ 王者归来:对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)
Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...
- php PAC 安装
LIUNX wget http://pecl.php.net/get/APC-3.1.8.tgz tar -zxvf APC-3.1.8.tgz cd APC-3.1.8 /usr/local/php ...
- 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
一.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将具有一些功能的代码封装到函数中,需要的时候调用即可 面向对象:对函数进行分类和封装,让开发更方便,更快捷 Java和C#只支持面型对象编程,, ...
- js简单对象List自定义属性排序
简单对象List自定义属性排序 <script type="text/javascript"> var objectList = new Array(); functi ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- pip与conda的区别
pip和conda到底有什么不一样? 今天看到我的foreman开始报错去询问才发现.我们的python包管理工具已经从pip整体迁移到了conda..最近的迁移真的非常多..前端也在迁移打包 跟着发 ...
- 关于vue中使用rem问题
1.下载lib-flexible 我使用的是vue-cli+webpack,所以是通过npm来安装的 npm i lib-flexible --save 2.引入lib-flexible 在main. ...
- HBase 学习之路(五)——HBase常用 Shell 命令
一.基本命令 打开Hbase Shell: # hbase shell 1.1 获取帮助 # 获取帮助 help # 获取命令的详细信息 help 'status' 1.2 查看服务器状态 statu ...
- Angular2国际化
使用angular-cli初始化项目: ng new my-project 使用npm安装ngx-translate模块 npm install --save @ngx-translate/core ...
- Spring Framework 组件注册 之 FactoryBean
Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...