欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于PyQt5實(shí)現(xiàn)一個(gè)無(wú)線網(wǎng)連接器

 更新時(shí)間:2022年08月04日 08:23:34   作者:Sir?老王  
為了方便不會(huì)python的朋友也能夠使用,本文將用pyqt5將制作一個(gè)帶界面的無(wú)線網(wǎng)連接器,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

最近打開(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)文章

最新評(píng)論