網站首頁 編程語言 正文
最近打開電腦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文件中直接運行即可。
原文鏈接:https://mp.weixin.qq.com/s/eUs2_IYdK5dMfSyvjsaESw
相關推薦
- 2022-11-29 React?Hooks獲取數據實現方法介紹_React
- 2023-03-18 C#?DataTable.Select()根據條件篩選數據問題_C#教程
- 2022-09-25 git提交代碼版本沖突問題
- 2023-07-07 CreateObject創建vbs對象時不支持中文而報錯
- 2022-05-04 python中使用多線程改進flask案例_python
- 2022-12-23 kotlin延遲初始化和密封類詳細講解_Android
- 2022-06-22 配置Git并從GitHub上克隆項目_其它綜合
- 2022-07-30 python實現網上購物系統_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支