一、实验环境

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 主程序运行中处理其他事件(多线程的一种代替方式)的更多相关文章

  1. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

  2. java多线程的几种实现方式

    java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...

  3. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  4. spring事务——try{...}catch{...}中事务不回滚的几种处理方式(转载)

    转载自   spring事务——try{...}catch{...}中事务不回滚的几种处理方式   当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @Respon ...

  5. 中央事件总线 事件驱动架构(EDA) 解析事件总线的4种实现方式

    事件驱动架构(EDA)https://mp.weixin.qq.com/s/nA8XFD2Rx_7qA_LxltGGHw https://mp.weixin.qq.com/s/cD3auglgKzOb ...

  6. 阿里巴巴--java多线程的两种实现方式,以及二者的区别

    阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...

  7. Java事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...

  8. Android点击事件通过kotlin几种实现方式总结

    一般来说,Android点击事件通过kotlin有以下几种实现方式: 1.通过全局接口View.OnClickListener实现,代码如下 //class MainActivity : AppCom ...

  9. 二、spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍

    包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc ...

随机推荐

  1. 编译 Qt 5.6(使QtWebEngine支持XP)

    说明 qt 5.6的编译进行了数十遍,才得出本文的可行方案,之所以花了这么多的时间,主要是qt引入了QtWebEngine模块后,导致编译难度直线上升,而且又有一些中国特色的问题(如360安全卫士)导 ...

  2. ZooKeeper学习第三期---Zookeeper命令操作(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...

  3. 【转】如何在Ubuntu 14.04 LTS上设置Nginx虚拟主机

    介绍 转自http://www.pandacademy.com/%E5%A6%82%E4%BD%95%E5%9C%A8ubuntu-14-04-lts%E4%B8%8A%E8%AE%BE%E7%BD% ...

  4. Spring 注解编程之模式注解

    Spring 框架中有很多可用的注解,其中有一类注解称模式注解(Stereotype Annotations),包括 @Component, @Service,@Controller,@Reposit ...

  5. java线程的简单实用

    1.start(): 先来看看Java API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法) ...

  6. Spark学习之路(四)—— RDD常用算子详解

    一.Transformation spark常用的Transformation算子如下表: Transformation算子 Meaning(含义) map(func) 对原RDD中每个元素运用 fu ...

  7. Storm 学习之路(一)—— Storm和流处理简介

    一.Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架,可以以简单.可靠的方式进行大数据流的处理.通常用于实时分析,在线机器学习.持续计算.分布式RPC.ETL等场景.Storm具有 ...

  8. javaWeb 概念介绍

    一.javaWeb 1.概念:利用java语言进行基于互联网的开发 2.软件架构 (1)C/S   Client/Server  客户端/服务器端 在用户本地有一个客户端程序,在远程有一个服务器程序 ...

  9. 【python】UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

    header中干掉 "Accept-Encoding": "gzip, deflate, br", 注意:

  10. nginx连接操作memcahe

    nginx配置连接操作memcache nginx配置连接memcache: location / { set $memcached_key "$uri"; #设置memcache ...