基于PyQt5實現(xiàn)一個無線網(wǎng)連接器
最近打開電腦wifi連接老是出現(xiàn)各種問題,于是突發(fā)奇想,我自己能不能做一個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模塊內(nèi)容導入到我們的代碼塊中就OK了。
import?time from?pywifi?import?const,?PyWiFi,?Profile
接下來就是PyQt5模塊了,這個模塊之前已經(jīng)使用好多回了,直接使用pip的方式安裝。安裝好PyQt5模塊后,將其導入到python代碼塊中。
from?PyQt5.QtWidgets?import?* from?PyQt5.QtGui?import?* from?PyQt5.QtCore?import?* import?sys import?traceback
2、UI應用
要制作wifi無線網(wǎng)連接小工具,需要先將UI界面部分寫好,話不多說,我們直接創(chuàng)建一個class來專門編寫關(guān)于UI界面的部分,開始介紹之前先來看一下我們已經(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 連接器??來源公眾號: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('處理進程展示區(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('開始連接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、業(yè)務線程
使用PyQt5中的QThread子線程來專門開發(fā)業(yè)務相關(guān)的代碼塊,實現(xiàn)使用名稱、密碼連接wifi的功能。然后將該線程加入到UI界面的主線程中單獨運行即可。這里將wifi連接和掃描wifi業(yè)務分為了兩個子線程來做,分別是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 設(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ù)將整個應用啟動即可看到整個頁面應用直接使用相應的功能連接wifi。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?WifiUI() ????main.show() ????sys.exit(app.exec_())
以上代碼塊部分乃是無線網(wǎng)連接器小工具的全部代碼塊,不用單獨再獲取源碼。將文章的全部帶那塊挨個copy到一個.py的python文件中直接運行即可。
到此這篇關(guān)于基于PyQt5實現(xiàn)一個無線網(wǎng)連接器的文章就介紹到這了,更多相關(guān)PyQt5無線網(wǎng)連接器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用html2text庫實現(xiàn)從HTML轉(zhuǎn)markdown的方法詳解
這篇文章主要介紹了python使用html2text庫實現(xiàn)從HTML轉(zhuǎn)markdown的方法,需要的朋友可以參考下2020-02-02Pytorch中的 torch.distributions庫詳解
這篇文章主要介紹了Pytorch中的 torch.distributions庫,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02PyQt5實現(xiàn)進度條與定時器及子線程同步關(guān)聯(lián)
這篇文章主要為大家詳細介紹了PyQt5如何實現(xiàn)進度條與定時器及子線程的同步關(guān)聯(lián),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-01-01Python使用pygame模塊編寫俄羅斯方塊游戲的代碼實例
這篇文章主要介紹了Python使用pygame模塊編寫俄羅斯方塊游戲的代碼實例,最基本的方塊變換和行消除等功能都在代碼中一一體現(xiàn),需要的朋友可以參考下2015-12-12nginx+uwsgi+django環(huán)境搭建的方法步驟
這篇文章主要介紹了nginx+uwsgi+django環(huán)境搭建的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11Python中的復制操作及copy模塊中的淺拷貝與深拷貝方法
淺拷貝和深拷貝是Python基礎(chǔ)學習中必須辨析的知識點,這里我們將為大家解析Python中的復制操作及copy模塊中的淺拷貝與深拷貝方法:2016-07-07