基于PyQt5實(shí)現(xiàn)一個(gè)無(wú)線網(wǎng)連接器
最近打開(kāi)電腦wifi連接老是出現(xiàn)各種問(wèn)題,于是突發(fā)奇想,我自己能不能做一個(gè)wifi連接的小工具豈不是就沒(méi)有這些麻煩了,居然成功了。
為了方便不會(huì)python的朋友也能夠使用,于是我用pyqt5將其做成了界面化的小工具,希望可以幫助到和我有一樣困惑的小伙伴。
另外,也可以幫助大家了解到pyqt5 ui的使用過(guò)程,最后我將wifi連接小工具打包成了exe的應(yīng)用程序,大家可以直接下載使用。
1、準(zhǔn)備
準(zhǔn)備工作就是介紹一下使用到的第三方的非標(biāo)準(zhǔn)庫(kù),第一個(gè)使用到的就是pywifi模塊,
使用這個(gè)模塊來(lái)完成對(duì)wifi的控制操作。
不過(guò)在運(yùn)行的過(guò)程中遇到了一個(gè)問(wèn)題,就是安裝好pywifi模塊以后還會(huì)提示缺少comtypes,不過(guò)沒(méi)有影響我們將這個(gè)庫(kù)安裝就好了。
pip?install?pywifi?-i?https://pypi.tuna.tsinghua.edu.cn/simple pip?install?comtypes?-i?https://pypi.tuna.tsinghua.edu.cn/simple
安裝好需要的第三方非標(biāo)準(zhǔn)庫(kù),將需要的python模塊內(nèi)容導(dǎo)入到我們的代碼塊中就OK了。
import?time from?pywifi?import?const,?PyWiFi,?Profile
接下來(lái)就是PyQt5模塊了,這個(gè)模塊之前已經(jīng)使用好多回了,直接使用pip的方式安裝。安裝好PyQt5模塊后,將其導(dǎo)入到python代碼塊中。
from?PyQt5.QtWidgets?import?* from?PyQt5.QtGui?import?* from?PyQt5.QtCore?import?* import?sys import?traceback
2、UI應(yīng)用
要制作wifi無(wú)線網(wǎng)連接小工具,需要先將UI界面部分寫好,話不多說(shuō),我們直接創(chuàng)建一個(gè)class來(lái)專門編寫關(guān)于UI界面的部分,開(kāi)始介紹之前先來(lái)看一下我們已經(jīng)寫好的UI界面效果。
wifi連接器主界面.png
class?WifiUI(QWidget): ????def?__init__(self): ????????super(WifiUI,?self).__init__() ????????self.init_ui() ????def?init_ui(self): ????????self.setWindowTitle('wifi 連接器??來(lái)源公眾號(hào):Python 集中營(yíng)') ????????self.setWindowIcon(QIcon('wifi.png')) ????????self.setFixedSize(500,?300) ????????self.brower?=?QTextBrowser() ????????self.brower.setFont(QFont('宋體',?8)) ????????self.brower.setReadOnly(True) ????????self.brower.setPlaceholderText('處理進(jìn)程展示區(qū)域...') ????????self.brower.ensureCursorVisible() ????????self.check_status_btn?=?QPushButton() ????????self.check_status_btn.setText('檢查連接狀態(tài)') ????????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('開(kāi)始連接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('開(kāi)始連接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('當(dāng)前計(jì)算機(jī)已連接wifi!') ????????else: ????????????self.show_message('當(dāng)前計(jì)算機(jī)未連接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、業(yè)務(wù)線程
使用PyQt5中的QThread子線程來(lái)專門開(kāi)發(fā)業(yè)務(wù)相關(guān)的代碼塊,實(shí)現(xiàn)使用名稱、密碼連接wifi的功能。然后將該線程加入到UI界面的主線程中單獨(dú)運(yùn)行即可。這里將wifi連接和掃描wifi業(yè)務(wù)分為了兩個(gè)子線程來(lái)做,分別是WiFiThread、CoonThread兩個(gè)線程。
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 設(shè)備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 連接出現(xiàn)異常!') ????????????self.finished.emit(True)
4、主函數(shù)
最后,使用main主函數(shù)將整個(gè)應(yīng)用啟動(dòng)即可看到整個(gè)頁(yè)面應(yīng)用直接使用相應(yīng)的功能連接wifi。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?WifiUI() ????main.show() ????sys.exit(app.exec_())
以上代碼塊部分乃是無(wú)線網(wǎng)連接器小工具的全部代碼塊,不用單獨(dú)再獲取源碼。將文章的全部帶那塊挨個(gè)copy到一個(gè).py的python文件中直接運(yùn)行即可。
到此這篇關(guān)于基于PyQt5實(shí)現(xiàn)一個(gè)無(wú)線網(wǎng)連接器的文章就介紹到這了,更多相關(guān)PyQt5無(wú)線網(wǎng)連接器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作家暴歸類
本文是Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理系列文章,帶大家開(kāi)啟一段學(xué)習(xí)自然語(yǔ)言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語(yǔ)言處理家暴歸類2021-09-09python使用html2text庫(kù)實(shí)現(xiàn)從HTML轉(zhuǎn)markdown的方法詳解
這篇文章主要介紹了python使用html2text庫(kù)實(shí)現(xiàn)從HTML轉(zhuǎn)markdown的方法,需要的朋友可以參考下2020-02-02Pytorch中的 torch.distributions庫(kù)詳解
這篇文章主要介紹了Pytorch中的 torch.distributions庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02PyQt5實(shí)現(xiàn)進(jìn)度條與定時(shí)器及子線程同步關(guān)聯(lián)
這篇文章主要為大家詳細(xì)介紹了PyQt5如何實(shí)現(xiàn)進(jìn)度條與定時(shí)器及子線程的同步關(guān)聯(lián),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01Python使用pygame模塊編寫俄羅斯方塊游戲的代碼實(shí)例
這篇文章主要介紹了Python使用pygame模塊編寫俄羅斯方塊游戲的代碼實(shí)例,最基本的方塊變換和行消除等功能都在代碼中一一體現(xiàn),需要的朋友可以參考下2015-12-12nginx+uwsgi+django環(huán)境搭建的方法步驟
這篇文章主要介紹了nginx+uwsgi+django環(huán)境搭建的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python中的復(fù)制操作及copy模塊中的淺拷貝與深拷貝方法
淺拷貝和深拷貝是Python基礎(chǔ)學(xué)習(xí)中必須辨析的知識(shí)點(diǎn),這里我們將為大家解析Python中的復(fù)制操作及copy模塊中的淺拷貝與深拷貝方法:2016-07-07