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 ...
随机推荐
- Building PySide on Microsoft Windows
Prerequisites MS Visual Studio Express 2008 [microsoft.com] NOTE: Visual Studio Express 2010 is not ...
- QThread的源码(直接搜索"thread.cpp"即可,或者在github里搜)
void QThread::run() { (void) exec(); } int QThread::exec() { Q_D(QThread); QMutexLocker locker(& ...
- windows service 之访问权限(有NetworkService和LocalSystem的区分)
最近写了一个关于从局域网的算机上下载文件的winodws service,最初认为应该没什么大的问题.通过本地的调试也没发现问题.但是当我把程序发布后发现服务报错“访问路径被拒绝”,我的第一感觉,肯定 ...
- STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析
在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handle ...
- CTF练习资源大全集
练习CTF清单/永久CTF清单 以下列出了一些长期运行的CTF实践站点和工具或CTF.谢谢,RSnake用于启动这是基于的原始版本.如果您有任何更正或建议,请随时通过dot com tld在域psif ...
- 基于 SpringBoot 的 FileService
fileservice file upload download 1.支持多种存储服务器上传.下载 2.支持大文件切片上传 3.存储记录信息使用 redis记录, 文件id可用于与业务数据库关联 4. ...
- 每天学点node系列-stream
在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的.这也应该是IO应有的方式. -- Doug Mc ...
- mysql中TINYINT的取值范围
在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官方<MySQL 5.1参考手册>http://dev.mysql.com ...
- CentOS Linux 重启详解
一.Linux 的五个重启命令 1.shutdown 2.poweroff 3.init 4.reboot 5.halt 二.五个重启命令的具体说明 shutdown reboot 在linux下一些 ...
- git中常用的操作命令有哪些?常用操作命令归纳
git中常用的操作命令有哪些?本篇文章就给到大家归纳了一些git中常用操作命令.有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. git开始 全局配置:配置用户名和e-mail地址 1 ...