您的位置:首页 > 编程语言 > Qt开发

pyqt 批量ping一个网段 返回结果 的程序 (加了个界面 效果不理想)

2015-09-29 15:05 411 查看
qt生成的界面:

文件 ping_ui.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ping_ui.ui'
#
# Created: Tue Sep 29 14:36:22 2015
#      by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s

try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(432, 663)
self.lineEdit = QtGui.QLineEdit(Form)
self.lineEdit.setGeometry(QtCore.QRect(30, 40, 151, 31))
self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(190, 40, 93, 28))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.tableView = QtGui.QTableView(Form)
self.tableView.setGeometry(QtCore.QRect(30, 80, 361, 561))
self.tableView.setObjectName(_fromUtf8("tableView"))
self.btn_clear = QtGui.QPushButton(Form)
self.btn_clear.setGeometry(QtCore.QRect(290, 40, 93, 28))
self.btn_clear.setObjectName(_fromUtf8("btn_clear"))

self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.pushButton.setText(_translate("Form", "Ping", None))
self.btn_clear.setText(_translate("Form", "clear", None))


主程序:

import subprocess
import threading
import time
import re
import sys
from ping_ui import Ui_Form
from PyQt4 import QtGui, QtCore

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
    
ip_num = 20
list_ping_result = []

class PingThread(threading.Thread):
    global list_ping_result
    def __init__(self,m_widget,t_id,str_ip,sleep_time,g_list_p_r):
        threading.Thread.__init__(self)
        self.sleep_time = sleep_time
        self.str_ip = str_ip
        self.list_p_r = g_list_p_r
        self.m_widget = m_widget
        self.t_id = t_id
    def run(self):
        if self.sleep_time == 0:
            self.sleep_time = 0.5
        time.sleep(self.sleep_time)
        ftp_sub = subprocess.Popen("ping %s -n 3" % self.str_ip,
                                  stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
        ret = ftp_sub.stdout.read()
        str_ret = ret.decode("gbk")
        ret_s = re.search("TTL",str_ret)
        if ret_s:
            list_ping_result.append(('ping    ok',self.str_ip))
            self.m_widget.model.setItem(self.t_id,0,QtGui.QStandardItem('ping    ok'))
            self.m_widget.model.setItem(self.t_id,1,QtGui.QStandardItem(self.str_ip))           
        else:
            list_ping_result.append(('ping error',self.str_ip))
            self.m_widget.model.setItem(self.t_id,0,QtGui.QStandardItem('ping error'))
            self.m_widget.model.setItem(self.t_id,1,QtGui.QStandardItem(self.str_ip))
            self.m_widget.model.item(self.t_id,0).setForeground(QtGui.QColor(255,0,0))
            self.m_widget.model.item(self.t_id,1).setForeground(QtGui.QColor(255,0,0))

class MainWidget(QtGui.QWidget):
    global list_ping_result
    def __init__(self, list_p_r,parent=None):
        super(MainWidget,self).__init__(parent=parent)
        self.init_ui()
    def init_ui(self):
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.lineEdit.setText("192.168.8.1")
        self.ui.pushButton.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"),
                                   self.slot_Pushbutton)
        self.ui.btn_clear.connect(self.ui.btn_clear,QtCore.SIGNAL("clicked()"),
                                  self.slot_btn_clear)
        
        self.model = QtGui.QStandardItemModel()
        self.model.setColumnCount(2)
        self.model.setHeaderData(0,1,_fromUtf8("结果"))
        self.model.setHeaderData(1,1,_fromUtf8("IP"))        
        self.ui.tableView.setModel(self.model)
        self.ui.tableView.setColumnWidth(0,80)
        self.ui.tableView.setColumnWidth(1,120)

        
    def run(self):
        while True:
            time.sleep(1)
            print("run")

    def slot_Pushbutton(self):
        str_ip = self.ui.lineEdit.text()
        ret = re.search("\d*\.\d*\.\d*\.",str_ip)
        if not ret:
            print("error ip")
            return
        str_ip = ret.group()
        self.thread_id =[]
        for i in range(256):
            self.thread_id.append(0)
            self.thread_id[i] = PingThread(self,i,str_ip + "%d" % i, int(i/20),list_ping_result)
            self.thread_id[i].start()
            print(i,end='')        

    def slot_btn_clear(self):
         self.model.removeRows(0,self.model.rowCount())
         
    def slot_return_result(self):
        i = 0
        while True:
            if i < len(list_ping_result):
                self.model.setItem(i,0,QtGui.QStandardItem(list_ping_result[i][0]))
                self.model.setItem(i,1,QtGui.QStandardItem(list_ping_result[i][1]))
                if list_ping_result[i][0] == "ping error":
                    self.model.item(i,0).setForeground(QtGui.QColor(255,0,0))
                    self.model.item(i,1).setForeground(QtGui.QColor(255,0,0))
                i+=1
            else:
                break
            
def cmp_s(toupe_str):
    str_val = toupe_str[1]
    ret_group = re.match("\d*",str_val[::-1])
    str_ret = ret_group.group()
    return int(str_ret[::-1])

app = QtGui.QApplication(sys.argv)
main_widget = MainWidget(list_ping_result)
main_widget.show()
app.exec_()

        


执行ping的时候由于同时创建了256个子进程,电脑会卡死十几秒 哈哈 无解。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: