我正在尝试学习如何在PyQt Gui应用程序中使用QThreads.我有一些运行一段时间的东西,有(通常)点我可以更新一个Gui,但我想将主要工作拆分到它自己的线程(有时候东西会卡住,最终会有一个很好的取消/再试一次按钮,如果由于主循环被阻止,Gui被冻结,这显然不起作用).
我已阅读https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/.该页面说重新实现该run方法不是这样做的方法.我遇到的问题是找到一个PyQt示例,其中有一个主线程正在执行Gui,而一个工作线程没有这样做.这篇博文是针对C++的,所以虽然它的例子确实有帮助,但我仍然有点失落.有人可以请给我一个在Python中正确方法的例子吗?
我正在研究一段时间来查找如何使用PyQT执行多线程程序的信息,更新GUI以显示结果.
我习惯于通过示例学习,我找不到(是的,我正在寻找几周)任何使用多线程执行如此简单任务的程序的简单示例,例如连接到www站点列表(5个线程)并且只是打印已处理带响应代码的网址.
任何人都可以共享代码或发送给我解释这样的程序的好教程吗?
我正在尝试用imaplib 创建一个邮箱检查器,它与python,队列和多线程没有gui工作得很好.
但是当我试图把一个gui,我所做的每一个功能,让gui冻结直到完成.
我从各种doc(添加qthread,signal,cursorr etcc)尝试了很多东西,而且没有一个教程对我有用.
有人可以帮助我理解如何在运行函数时设置或附加文本到QtextEdit,因为它只在完成后工作.
这是我的代码:
class Checker(QtCore.QThread):
signal = QtCore.pyqtSignal(object)
def __init__(self, lignesmailtocheck):
QtCore.QThread.__init__(self)
self.lignesmailtocheck = lignesmailtocheck
def run(self):
lignemailtocheck = self.lignesmailtocheck.strip()
maillo, passo = lignemailtocheck.split(":",1)
debmail, finmail = maillo.split("@",1)
setimap =["oultook.com:imap-mail.outlook.com", "gmail.com:imap.gmail.com"]
for lignesimaptocheck in sorted(setimap):
ligneimaptocheck = lignesimaptocheck.strip()
fai, imap = ligneimaptocheck.split(":",1)
if finmail == fai:
passo0 = passo.rstrip()
try :
mail = imaplib.IMAP4_SSL(imap)
mail.login(maillo, passo)
mailboxok = open("MailBoxOk.txt", "a+", encoding='utf-8', errors='ignore')
mailboxok.write(maillo+":"+passo+"\n")
mailboxok.close()
totaly = maillo+":"+passo0+":"+imap
print(maillo+":"+passo+"\n")
self.send_text.emit(totaly)
time.sleep(1)
except imaplib.IMAP4.error:
print ("LOGIN …Run Code Online (Sandbox Code Playgroud) 我有以下代码scan_value在更新ui(progress)中的进度条时执行后台操作().scan_value迭代某个值obj,value_changed每次更改值时发出signal().由于这里不相关的原因,我必须将它包装Scanner在另一个线程的object()中.当一个按钮扫描仪被称为scan是clicked.这是我的问题...以下代码工作正常(即进度条按时更新).
# I am copying only the relevant code here.
def update_progress_bar(new, old):
fraction = (new - start) / (stop - start)
progress.setValue(fraction * 100)
obj.value_changed.connect(update_progress_bar)
class Scanner(QObject):
def scan(self):
scan_value(start, stop, step)
progress.setValue(100)
thread = QThread()
scanner = Scanner()
scanner.moveToThread(thread)
thread.start()
scan.clicked.connect(scanner.scan)
Run Code Online (Sandbox Code Playgroud)
但如果我将最后一部分更改为:
thread = QThread()
scanner = Scanner()
scan.clicked.connect(scanner.scan) # This was at the end!
scanner.moveToThread(thread)
thread.start()
Run Code Online (Sandbox Code Playgroud)
进度条仅在最后更新(我的猜测是所有内容都在同一个线程上运行).如果在将对象接收对象移动到线程之前将信号连接到插槽,是否应该无关紧要.
我有一个内部带有while循环的Python代码,但是我不知道如何使其与我的PyQt GUI一起工作-我只能运行Qt窗口或该循环(但窗口不会显示)。有什么解决办法吗?我读了一些QThreads或QTimers,但我不知道如何使用它。
关于GUI编程,我几乎是一个初学者。我将QT与python绑定(PyQT4)结合使用。
我正在尝试做的是:
QThread使用pyserial读取和写入串行端口的端口。QThread。并通过QThread信号从接收串行数据
。我基于此代码(Link)开始了自己的测试实现。在此之前,我阅读了有关QThread的基础知识,并试图了解如何使用它们。以下测试代码是我提出的。对不起,我试图将其保持在最低水平,但仍然是75行代码:
from PyQt4 import QtCore, QtGui
import time
import sys
class SerialData(QtCore.QObject):
def __init__(self, message):
super(SerialData, self).__init__()
self.__m = message
def getMsg(self):
return self.__m
class SerialCon(QtCore.QObject):
finished = QtCore.pyqtSignal()
received = QtCore.pyqtSignal(SerialData)
def init(self):
super(SerialCon, self).__init__()
# TODO setup serial connection:
# setting up a timer to check periodically for new received serial data
self.timer = QtCore.QTimer()
self.timer.setInterval(400)
self.timer.timeout.connect(self.readData)
self.timer.start(200)
# self.finished.emit()
def readData(self):
self.received.emit(SerialData("New …Run Code Online (Sandbox Code Playgroud) 我正在使用 PyQt5 在菜单系统托盘中工作。我对 PyQt5 很陌生,我想做的是触发一个动作而不会阻止菜单(多线程)。在阅读了很多地方之后,我得出的结论是 usingQthread应该是要走的路(但如果我能理解该类的工作原理......)。但是,threading考虑到我的应用程序非常简单,使用也不会那么糟糕。因此,我尝试使用以下代码import threading:
from PyQt5 import QtCore, QtGui, QtWidgets
import threading
class menubar(object):
def __init__(self):
signal.signal(signal.SIGINT, signal.SIG_DFL)
self.systray = True
self.stopped = False
def search_menu(self):
self.SearchAction = menu.addAction("Search")
self.SearchAction.triggered.connect(self.search_cast)
def _search_cast_(self):
args.select_cc = True
self.cc.initialize_cast()
self.cast_list()
def search_cast(self):
threading.Thread(target=self._search_cast_).start()
#some more methods here...
def main():
menubar()
app = QtWidgets.QApplication(sys.argv)
tray = QtWidgets.QSystemTrayIcon(icon)
menu = QtWidgets.QMenu()
start = menubar()
start.search_menu()
start.separator_menu()
start.populating_menu()
start.separator_menu()
start.stop_menu()
start.resetaudio_menu()
start.about_menu()
start.exit_menu()
tray.setContextMenu(menu)
tray.show()
app.exec_()
if …Run Code Online (Sandbox Code Playgroud) 如何在弹出窗口中实现一个进度条,该窗口通过QThread监视来自所谓的 Worker 类(即时间/CPU 消耗任务)的运行函数的进度?
我已经检查了无数示例和教程,但进度条显示在弹出窗口中的事实似乎使一切变得更加困难。我相信我想要的是一件相当简单的事情,但我一直在失败,而且我的想法也用完了。
我有一个我想要实现的例子,它基于这个答案:
import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal, QObject, pyqtSlot
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QHBoxLayout, QProgressBar, QVBoxLayout
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Widget")
self.h_box = QHBoxLayout(self)
self.main_window_button = QPushButton("Start")
self.main_window_button.clicked.connect(PopUpProgressB)
self.h_box.addWidget(self.main_window_button)
self.setLayout(self.h_box)
self.show()
class Worker(QObject):
finished = pyqtSignal()
intReady = pyqtSignal(int)
@pyqtSlot()
def proc_counter(self): # A slot takes no params
for i in range(1, 100):
time.sleep(1)
self.intReady.emit(i)
self.finished.emit()
class PopUpProgressB(QWidget):
def …Run Code Online (Sandbox Code Playgroud)