一、实验环境

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. HTML5 拖放并删除效果的简单实现

    Html5 支持元素drag drop的功能需求,以后实现这类效果会简单很多.. 详细的文档说明在这里 代码如下所示:

  2. delphi中pos和Ansipos函数的区别

    POS和ANSIPOS的主要区别在于,POS参数多用于是一个字符,而ANSIPOS多用于是多个字符: 例如:i:=pos('a','sssssas'); i:=ansipos('abc','sdabc ...

  3. 全量导入数据 导致solr内存溢出 崩溃问题解决

    在 data-config.xml 文件中 增加一个参数即可: batchSize="-1"    

  4. python读取json文件并解析

    # -*- coding: utf-8 -*- import os import json import sys reload(sys) sys.setdefaultencoding('utf-8') ...

  5. springboot读取本地项目文件

    在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式 File file= ResourceUtils ...

  6. 关于web系统整体优化提速总结

    关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要逐步的对系统从整体上进行改造升级,通 ...

  7. Python-基本数据类型(list,tuple)

    一. 列列表 1.1   列列表的介绍 列表是python的基础数据类型之⼀一,其他编程语言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素用' , ...

  8. Ubuntu --- Virtualbox 和 宿主机文件夹共享

    1.在设置里面共享文件夹 2.在Ubuntu中配置 sudo mount -t vboxsf share /var/www/html/ 无需重启即可生效 3.实现系统重启后也自动挂载 在文件 /etc ...

  9. http-get调用接口简单代码

    一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpGet get=null; try {HttpClient httpClient = new D ...

  10. smobiler介绍(二)

    类似开发WinForm的方式,使用C#开发Android和IOS的移动应用?听起来感觉不可思议,那么Smobiler平台到底是如何实现的呢,这里给大家介绍一下. 客户端 Smobiler分为两种客户端 ...