我已經用我的這個小程式整理了所有內容,但是在我將實際資料插入字典后,button.setEnable(False) 停止作業。任何想法為什么?
代碼:
self.countBtn = QPushButton("Do something", self)
self.countBtn.clicked.connect(self.onButtonClick)
def onButtonClick(self):
self.serversChecked = Worker()
self.textOutput.clear()
self.serversChecked.amount_of_servers.connect(self.setupUi)
self.serversChecked.progress.connect(self.countCheckedServers)
self.serversChecked.offline_servers.connect(self.toScreen)
self.serversChecked.pbar_step.connect(self.pbar_step)
self.serversChecked.amount_of_servers.connect(self.maxPbar)
self.serversChecked.start()
self.countBtn.setEnabled(False)
self.serversChecked.finished.connect(
lambda: self.countBtn.setEnabled(True)
)
這是我認為相關的所有代碼,如果需要更多代碼,我可以提供。
歡迎任何想法,因為我很困惑......
編輯:根據要求,其余代碼:
import sys, os, subprocess
from PyQt5.QtCore import QThread, pyqtSignal, Qt
from PyQt5.QtWidgets import (
QApplication,
QLabel,
QMainWindow,
QPlainTextEdit,
QPushButton,
QVBoxLayout,
QWidget,
QProgressBar
)
class Worker(QThread):
finished = pyqtSignal(str)
progress = pyqtSignal(int)
offline_servers = pyqtSignal(str)
amount_of_servers = pyqtSignal(int)
pbar_step = pyqtSignal(float)
start_long_task = pyqtSignal(int)
ips = {
'001' : '142.250.178.14', '002' : '104.18.2.89', '003' : '10.251.63.23'
}
amount_of_servers_int = len(ips)
def run(self):
self.start_long_task.emit(1)
amount_of_servers_int = len(self.ips)
self.amount_of_servers.emit(amount_of_servers_int)
with open(os.devnull, 'w') as DEVNULL:
server = 0
pbar_progress = 0
for x, y in self.ips.items():
try:
subprocess.check_call(
['ping', '-n', '1', y],
stdout=DEVNULL, # suppress output
stderr=DEVNULL
)
except subprocess.CalledProcessError:
nextServer = (working output here)
self.offline_servers.emit(nextServer)
server = server 1
pbar_progress = pbar_progress 1
self.pbar_step.emit(pbar_progress)
self.progress.emit(server)
self.finished.emit('')
class Window(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi()
def setupUi(self):
self.setWindowTitle("")
self.resize(300, 400)
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.textOutput = QPlainTextEdit(self)
self.textOutput.setReadOnly(True)
self.textOutput.resize(280, 300)
self.textOutput.move(10, 5)
self.serversCheckedtoScreen = QLabel("Checked: ", self)
self.serversCheckedtoScreen.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.pbar = QProgressBar(self, objectName="progressBar")
self.pbar.setGeometry(200, 80, 280, 20)
self.pbar.setValue(0)
self.pbar.setMinimum(0)
self.countBtn = QPushButton("Check Servers", self)
self.countBtn.clicked.connect(self.onButtonClick)
# Set the layout
layout = QVBoxLayout()
layout.addWidget(self.textOutput)
layout.addWidget(self.serversCheckedtoScreen)
layout.addWidget(self.pbar)
layout.addWidget(self.countBtn)
self.pbar.setStyleSheet("""
QWidget {
text-align: center;
}
""")
self.centralWidget.setLayout(layout)
def onButtonClick(self):
self.serversChecked = Worker()
self.textOutput.clear()
################This is the issue as pointed out by @musicamante ##########
**self.serversChecked.amount_of_servers.connect(self.setupUi)**
################This piece of code shouldnt even be here, code blindness is a thing #####
self.serversChecked.progress.connect(self.countCheckedServers)
self.serversChecked.offline_servers.connect(self.toScreen)
self.serversChecked.pbar_step.connect(self.pbar_step)
self.serversChecked.amount_of_servers.connect(self.maxPbar)
self.serversChecked.start_long_task.connect(self.disableButton)
self.serversChecked.start()
self.countBtn.setEnabled(False) ##### WHY IT DOESNT WORK
self.serversChecked.finished.connect(
lambda: self.countBtn.setEnabled(True)
)
def countCheckedServers(self, value):
max = self.serversChecked.amount_of_servers_int
self.serversCheckedtoScreen.setText(f"Servers Checked: {value} / " str(max))
def toScreen(self, value):
self.textOutput.appendPlainText(value)
def pbar_step(self, value):
self.pbar.setValue(int(value))
def maxPbar(self,value):
self.pbar.setMaximum(value)
def disableButton(self, n): # added extra function to check but makes no difference
if n == 1:
self.countBtn.setDisabled(True)
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec())
uj5u.com熱心網友回復:
正如@musicamante 在評論中正確指出的那樣,我在下面留下了一行代碼
def onButtonClick(self):
self.serversChecked = Worker()
self.textOutput.clear()
洗掉后
self.serversChecked.amount_of_servers.connect(self.setupUi)
按照他的建議,問題已經解決了。我已經要求他創建一個答案,這樣我就可以相信他,我希望他能盡快做到。因此,我還沒有標記為完整。
與此同時,他的原始評論的副本:
self.setupUi每次啟動作業程式時都會呼叫,因此您正在創建一個新的 UI。該信號不會立即發出,而是異步發出。因此,按鈕被禁用,但在此之后執行緒實際啟動,這會創建一個新的 UI,并帶有一個啟用的按鈕。洗掉self.serversChecked.amount_of_servers.connect(self.setupUi)。
可悲的是,代碼盲是一回事,但是,有一些杰出的人愿意提供幫助。再次感謝@musicamante
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381901.html
上一篇:HTML按鈕標簽css
下一篇:聚焦按鈕并更改div的顯示
