基于PyQt5实现一个无线网连接器

 更新时间:2022年08月04日 08:23:34   作者:Sir 老王  
为了方便不会python的朋友也能够使用,本文将用pyqt5将制作一个带界面的无线网连接器,文中的示例代码讲解详细,感兴趣的可以了解一下

最近打开电脑wifi连接老是出现各种问题,于是突发奇想,我自己能不能做一个wifi连接的小工具岂不是就没有这些麻烦了,居然成功了。

为了方便不会python的朋友也能够使用,于是我用pyqt5将其做成了界面化的小工具,希望可以帮助到和我有一样困惑的小伙伴。

另外,也可以帮助大家了解到pyqt5 ui的使用过程,最后我将wifi连接小工具打包成了exe的应用程序,大家可以直接下载使用。

1、准备

准备工作就是介绍一下使用到的第三方的非标准库,第一个使用到的就是pywifi模块,
使用这个模块来完成对wifi的控制操作。

不过在运行的过程中遇到了一个问题,就是安装好pywifi模块以后还会提示缺少comtypes,不过没有影响我们将这个库安装就好了。

pip install pywifi -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install comtypes -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好需要的第三方非标准库,将需要的python模块内容导入到我们的代码块中就OK了。

import time

from pywifi import const, PyWiFi, Profile

接下来就是PyQt5模块了,这个模块之前已经使用好多回了,直接使用pip的方式安装。安装好PyQt5模块后,将其导入到python代码块中。

from PyQt5.QtWidgets import *

from PyQt5.QtGui import *

from PyQt5.QtCore import *

import sys

import traceback

2、UI应用

要制作wifi无线网连接小工具,需要先将UI界面部分写好,话不多说,我们直接创建一个class来专门编写关于UI界面的部分,开始介绍之前先来看一下我们已经写好的UI界面效果。

wifi连接器主界面.png

class WifiUI(QWidget):
    def __init__(self):
        super(WifiUI, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('wifi 连接器  来源公众号:Python 集中营')
        self.setWindowIcon(QIcon('wifi.png'))
        self.setFixedSize(500, 300)

        self.brower = QTextBrowser()
        self.brower.setFont(QFont('宋体', 8))
        self.brower.setReadOnly(True)
        self.brower.setPlaceholderText('处理进程展示区域...')
        self.brower.ensureCursorVisible()

        self.check_status_btn = QPushButton()
        self.check_status_btn.setText('检查连接状态')
        self.check_status_btn.clicked.connect(self.check_status_btn_click)

        self.wifi_list_btn = QPushButton()
        self.wifi_list_btn.setText('获取wifi列表')
        self.wifi_list_btn.clicked.connect(self.wifi_list_btn_click)

        self.wifi_ssid_in = QLineEdit()
        self.wifi_ssid_in.setPlaceholderText('wifi 名称')

        self.wifi_pwd_in = QLineEdit()
        self.wifi_pwd_in.setPlaceholderText('wifi 密码')

        self.conn_btn = QPushButton()
        self.conn_btn.setText('开始连接wifi')
        self.conn_btn.clicked.connect(self.connect_wifi)

        hbox = QHBoxLayout()
        hbox.addWidget(self.brower)
        vbox = QVBoxLayout()
        vbox.addWidget(self.check_status_btn)
        vbox.addWidget(self.wifi_list_btn)
        vbox.addWidget(self.wifi_ssid_in)
        vbox.addWidget(self.wifi_pwd_in)
        vbox.addStretch(1)
        vbox.addWidget(self.conn_btn)
        hbox.addLayout(vbox)

        self.setLayout(hbox)

        self.wifi_list_thread = WiFiThread()
        self.wifi_list_thread.message.connect(self.show_message)
        self.wifi_list_thread.finished.connect(self.finished_wifilist)

        self.wifi_conn_thread = CoonThread(self)
        self.wifi_conn_thread.message.connect(self.show_message)
        self.wifi_conn_thread.finished.connect(self.finished_conn)

    def finished_wifilist(self, finished):
        if finished is True:
            self.wifi_list_btn.setEnabled(True)
            self.wifi_list_btn.setText('获取wifi列表')

    def finished_conn(self, finished):
        if finished is True:
            self.conn_btn.setEnabled(True)
            self.conn_btn.setText('开始连接wifi')

    def show_message(self, text):
        cursor = self.brower.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.brower.append(text)
        self.brower.setTextCursor(cursor)
        self.brower.ensureCursorVisible()

    def check_status_btn_click(self):
        wifi = PyWiFi()
        interface = wifi.interfaces()[0]

        if interface.status() in [const.IFACE_CONNECTED, const.IFACE_INACTIVE]:
            self.show_message('当前计算机已连接wifi!')
        else:
            self.show_message('当前计算机未连接wifi!')

    def wifi_list_btn_click(self):
        self.wifi_list_btn.setEnabled(False)
        self.wifi_list_btn.setText('正在获取...')
        self.wifi_list_thread.start()

    def connect_wifi(self):
        self.conn_btn.setEnabled(False)
        self.conn_btn.setText('正在连接...')
        self.wifi_conn_thread.start()

3、业务线程

使用PyQt5中的QThread子线程来专门开发业务相关的代码块,实现使用名称、密码连接wifi的功能。然后将该线程加入到UI界面的主线程中单独运行即可。这里将wifi连接和扫描wifi业务分为了两个子线程来做,分别是WiFiThread、CoonThread两个线程。

class WiFiThread(QThread):
    message = pyqtSignal(str)
    finished = pyqtSignal(bool)

    def __init__(self):
        super(WiFiThread, self).__init__()
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        wifi = PyWiFi()
        interface = wifi.interfaces()[0]

        interface.scan()
        self.message.emit('正在扫描wifi列表...')
        time.sleep(3)
        wifis = interface.scan_results()
        self.message.emit('wifi列表扫描完成!')

        for i in wifis:
            self.message.emit('wifi 名称:{}'.format(i.ssid))
            self.message.emit('wifi 设备mac地址:{}'.format(i.bssid))

        self.finished.emit(True)


class CoonThread(QThread):
    message = pyqtSignal(str)
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(CoonThread, self).__init__(parent)
        self.working = True
        self.parent = parent

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        try:
            wifi = PyWiFi()
            interface = wifi.interfaces()[0]

            if interface.status() == const.IFACE_CONNECTED:
                interface.disconnect()
                time.sleep(3)

            profile = Profile()  # 配置文件
            profile.ssid = self.parent.wifi_ssid_in.text().strip()  # wifi名称
            self.message.emit('wifi 名称:{}'.format(self.parent.wifi_ssid_in.text().strip()))
            profile.auth = const.AUTH_ALG_OPEN  # 需要密码
            profile.akm.append(const.AKM_TYPE_WPA2PSK)  # 加密类型
            profile.cipher = const.CIPHER_TYPE_CCMP  # 加密单元
            profile.key = self.parent.wifi_pwd_in.text().strip()  # wifi密码
            self.message.emit('wifi 密码:{}'.format(self.parent.wifi_pwd_in.text().strip()))

            interface.remove_all_network_profiles()  # 删除其它配置文件
            tmp_profile = interface.add_network_profile(profile)  # 加载配置文件
            interface.connect(tmp_profile)

            time.sleep(5)

            if interface.status() == const.IFACE_CONNECTED:
                self.message.emit('wifi名称:{}连接成功!'.format(self.parent.wifi_ssid_in.text().strip()))
            else:
                self.message.emit('wifi名称:{}连接失败!'.format(self.parent.wifi_ssid_in.text().strip()))

            time.sleep(1)
            self.finished.emit(True)
        except Exception as e:
            traceback.print_exc()
            self.message.emit('wifi 连接出现异常!')
            self.finished.emit(True)

4、主函数

最后,使用main主函数将整个应用启动即可看到整个页面应用直接使用相应的功能连接wifi。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = WifiUI()
    main.show()
    sys.exit(app.exec_())

以上代码块部分乃是无线网连接器小工具的全部代码块,不用单独再获取源码。将文章的全部带那块挨个copy到一个.py的python文件中直接运行即可。

到此这篇关于基于PyQt5实现一个无线网连接器的文章就介绍到这了,更多相关PyQt5无线网连接器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python使用sftp实现上传和下载功能(实例代码)

    Python使用sftp实现上传和下载功能(实例代码)

    在Python中可以使用paramiko模块中的sftp登陆远程主机,实现上传和下载功能。接下来通过本文给大家介绍Python使用sftp实现上传和下载功能,需要的朋友参考下
    2017-03-03
  • 通用的Django注册功能模块实现方法

    通用的Django注册功能模块实现方法

    这篇文章主要介绍了通用的Django注册功能模块实现步骤,帮助大家更好的理解和使用django,感兴趣的朋友可以了解下
    2021-02-02
  • PyTorch中关于tensor.repeat()的使用

    PyTorch中关于tensor.repeat()的使用

    这篇文章主要介绍了PyTorch中关于tensor.repeat()的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 如何利用opencv判断两张图片是否相同详解

    如何利用opencv判断两张图片是否相同详解

    这篇文章主要给大家介绍了关于如何利用opencv判断两张图片是否相同的相关资料,OpenCV是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法,需要的朋友可以参考下
    2021-07-07
  • 详解在python中如何使用zlib模块进行数据压缩和解压缩

    详解在python中如何使用zlib模块进行数据压缩和解压缩

    Python有一些内置库用于处理数据压缩和解压缩,其中一个就是zlib模块,这个模块为DEFLATE压缩算法和相关的gzip(文件格式)提供了支持,在这篇文章中,我们将深入探讨如何使用zlib模块进行数据压缩和解压缩
    2023-06-06
  • Flask框架Jinjia模板常用语法总结

    Flask框架Jinjia模板常用语法总结

    这篇文章主要介绍了Flask框架Jinjia模板常用语法,结合实例形式总结分析了Jinjia模板的变量、赋值、流程控制、函数、块、宏等基本使用方法,需要的朋友可以参考下
    2018-07-07
  • 使用python自动追踪你的快递(物流推送邮箱)

    使用python自动追踪你的快递(物流推送邮箱)

    本文讲解如何让 python自动为你查询快递信息 ,并在物流发生更新或者到达指定地点时第一时间将 物流推送至你的邮箱,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-03-03
  • Django+uni-app实现数据通信中的请求跨域的示例代码

    Django+uni-app实现数据通信中的请求跨域的示例代码

    这篇文章主要介绍了Django+uni-app实现数据通信中的请求跨域的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python实现一个简单的递归下降分析器

    Python实现一个简单的递归下降分析器

    这篇文章主要介绍了Python如何实现一个简单的递归下降分析器,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Django操作session 的方法

    Django操作session 的方法

    这篇文章主要介绍了Django操作session 的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论