PyQt:计时器无法从另一个线程启动

2024-02-14

我正在使用 python 制作 Qt GUI,但收到错误: QObject::startTimer: 无法从另一个线程启动计时器。当我运行 readModemSnap 方法时会发生这种情况。我已经为此工作了近一周,尝试了许多不同的 Qt 线程设计模式,我在网上找到了这些模式,但没有任何效果。

class ModemScopeWindow(QMainWindow, Ui_ModemScope):
def __init__(self, parent=None):
    super(ModemScopeWindow, self).__init__(parent)

    # Set up the user interface from Designer.
    self.setupUi(self)

    self.thread = MainThread()

    """
    signal connections
    """

    self.thread.newSnap.connect(self.updateScene)       
    self.thread.updateStatus.connect(self.setStatus) 


    self.thread.connectionLock.lock()
    self.thread.runLock.lock()

    self.connect(self.runButton, SIGNAL("clicked()"), self.thread.runLock.unlock, Qt.QueuedConnection)

    self.connect(self.connectButton, SIGNAL("clicked()"), self.thread.connectionLock.unlock, Qt.QueuedConnection)


class MainThread(QThread):

newSnap = pyqtSignal(QGraphicsScene)
updateStatus = pyqtSignal(str)
initConnect = pyqtSignal()

def __init__(self, parent = None):
    super(MainThread, self).__init__(parent)

    self.samples = []

    self.connectionLock = QMutex()
    self.runLock = QMutex()        
    self.cliMute = QMutex()

    self._displayCrosshairs = True
    self._displayGrid = True
    self.persistantMode = False
    self.sampleDepth = 1

    self._currentHaam = "4"

    color = QColor(10,255,71)
    self.plotPen = QPen(color)


    self._leftXscene = -VIEW_SIZE/2
    self._topYscene = -VIEW_SIZE/2
    self._rightXscene = VIEW_SIZE/2
    self._bottomYscene = VIEW_SIZE/2
    self._leftXworld = -10.0
    self._topYworld = 10.0
    self._rightXworld = 10.0
    self._bottomYworld = -10.0
    self._scene = QGraphicsScene(self._leftXscene, self._topYscene, VIEW_SIZE, VIEW_SIZE, self)

    self.start(QThread.HighestPriority)

def run(self):

    self.updateStatus.emit("Enter target IP address and press Connect")

    self.connectionLock.lock()
    self.connectModem()

    while(1):
        self.runLock.lock() 
        #compile scene

        self.readModemSnap()
        self.newSnap.emit(self._scene)
        self.runLock.unlock()

def readModemSnap(self):
    self.updateStatus.emit("Reading Modem Snap...")

    print len(self.samples)
    if len(self.samples) >= self.sampleDepth:# and not self.persistantMode:
        self.samples.pop(0)

    self.cliMute.lock()
    temp = cli.getModemSnap()
    self.cliMute.unlock()
    self.samples.append(temp)


    self.cliMute.lock()
    modType = cli.modemRead(80)
    self.cliMute.unlock()

    if((modType | 0x0FFFFFFF) == 0x0FFFFFFF):
        modType = "0";

    else:
        modType = "%x"%modType
        modType = str(modType)


    modType = "0"
    self.updateStatus.emit("Done") 

    self.refresh()

    self._currentHaam = modType[0]
    if self._displayGrid:
        self.plotModulation(self._currentHaam)

    self.handleSnapshotResponse()

    self.updateStatus.emit("Ready to Run")
def refresh(self):

    #delete scene
    items = self._scene.items()

    for x in items:
        self._scene.removeItem(x)

    #repaint the crosshairs
    if self._displayCrosshairs:
        self.plotLine(-VIEW_SIZE,0,+VIEW_SIZE,0, self.plotPen)
        self.plotLine(0, -VIEW_SIZE,0, +VIEW_SIZE, self.plotPen)
        self.plotScaleTicks()

    #repaint grid
    if self._displayGrid:
        self.plotModulation(self._currentHaam)

    self.newSnap.emit(self._scene)

def handleSnapshotResponse(self):

    for x in range(len(self.samples)):
        for sample in self.samples[x]:
            upper = (sample >> 16) & 0xffff;
            lower = sample & 0xffff
            if (upper & 0x8000):
                upper -= 0x10000
            if (lower & 0x8000):
                lower -= 0x10000
            upper = float(upper)/128.0
            lower = float(lower)/128.0
            self.plot(upper, lower)

如您所见,我没有从另一个线程启动任何线程。我使用 main 来启动 UI,它创建一个在构造时自行启动的 MainThread。当我注释掉行来定位问题时,我发现它是在 readModemSnap 方法中调用 self.refresh() 和 self.handleSnapshotResponse() 时发生的。谁能指出我做错了什么?或者有关于QThreading的教程吗?提前致谢


这是规则:除了运行 Qt 事件循环的主线程之外,您不能从任何线程调用任何 GUI 函数。当您看到有关 QTimer 的错误时,可能是因为 GUI 中的某些内容在内部使用了计时器,并且它是从另一个线程触发的。

您的情况最可能的罪魁祸首是您正在从工作线程对 QGraphicsScene 进行操作。我会尝试重新安排,以便在响应 newSnap 信号时调用 MainThread.reload 中的代码,而不是在它之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt:计时器无法从另一个线程启动 的相关文章

  • 如何删除 PyCharm 中的项目?

    如果我关闭一个项目 然后删除该项目文件夹 则在 PyCharm 重新启动后 会再次创建一个空的项目文件夹 只需按顺序执行以下步骤即可 他们假设您当前在 PyCharm 窗口中打开了该项目 单击 文件 gt 关闭项目 关闭项目 在 PyCha
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • 如何在python中附加两个字节?

    说你有b x04 and b x00 你如何将它们组合起来b x0400 使用Python 3 gt gt gt a b x04 gt gt gt b b x00 gt gt gt a b b x04 x00
  • Python re无限执行

    我正在尝试执行这段代码 import re pattern r w w s re compiled re compile pattern results re compiled search COPRO HORIZON 2000 HOR p
  • python array(10,1) 和 array(10,) 之间的区别

    我正在尝试将 MNIST 数据集加载到数组中 当我使用 X train y train X test y test mnist load data 我得到一个数组 y test 10000 但我希望它的形状为 10000 1 数组 1000
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程
  • python celery -A 的无效值无法加载应用程序

    我有一个以下项目目录 azima init py main py tasks py task py from main import app app task def add x y return x y app task def mul
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

    我有一个正在运行的 python 程序 它使用 suds 通过 SOAP 获取大量数据 Web服务是通过分页功能实现的 这样我就可以抓取nnn每个 fetch 调用的行并获取下一个nnn与后续的电话 如果我使用如下代码向 HTTP 服务器进
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 如何通过函数注释指示函数需要函数作为参数,或返回函数?

    您可以使用函数注释 http www python org dev peps pep 3107 在python 3中指示参数和返回值的类型 如下所示 def myfunction name str age int gt str return
  • 根据多个阈值将 SciPy 分层树状图切割成簇

    我想将 SciPy 的树状图切割成多个具有多个阈值的簇 我尝试过使用 fcluster 但它只能削减一个阈值 例如 这是我从另一个问题中摘取的一段代码 import pandas data pandas DataFrame total ru
  • 非法指令:MacOS High Sierra 上有 4 条指令

    我正在尝试在 pygame 3 6 中制作一个看起来像聊天的窗口 我刚刚将我的 MacBook 更新到版本 10 13 6 在我这样做之前它工作得很好 但在我收到消息之后 非法指令 4 Code import pygame from pyg
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s

随机推荐

  • 运行集成测试时,构建在 Jetty 启动时等待

    我正在尝试运行一些集成 验收测试 我只想在传递环境变量时运行这些测试 因此我使用以下命令 mvn clean install Denv acceptance 但构建停止于 2015 09 28 18 56 19 273 INFO oejsh
  • 在 C# 中获取网络摄像头的当前状态

    我试图弄清楚如何检查网络摄像头 视频捕获设备是否已被另一个应用程序使用 而无需实际激活它 我当前的方法是使用 AForge NET 库并使用 VideoCaptureDevice 对象的 IsRunning 属性 如下所示 var vide
  • PHP 合并具有相同键和一个相同值的数组

    我需要合并一个 PHP 数组 这个数组有 2 个名为 targetXX 的数组 我可以有 2 个或更多 每个目标都有相同的键 对于每个键 我有一个包含 2 个值 a 和 b 的数组 a 在两个目标中始终相同 但我需要像这样合并两个 B 值
  • 如何从 ASCII 文件写入/读取带有 MultiIndex 的 Pandas DataFrame?

    我希望能够创建一只熊猫DataFrame使用 MultiIndexes 为行和列索引并从 ASCII 文本文件中读取它 我的数据如下所示 col indx MultiIndex from tuples A B C A B C2 A B C3
  • Nodejs child_process.exec :禁用控制台上的标准输出打印

    我正在通过nodejs child process exec执行图像magick识别命令 并在我的脚本中使用从 stdout 返回的字符串 一切正常 但调用会在控制台上打印标准输出消息 如果服务器未重新启动并且控制台一段时间内未清除 则控制
  • 绘制可翻转的矩形

    我得到了代码http support microsoft com kb 314945 http support microsoft com kb 314945绘制一个可翻转 橡皮筋矩形 我向其中添加了代码 这样当我离开鼠标左键时 也会在图像
  • 四舍五入到最接近的好数字

    我正在编写一个应用程序 需要将标签舍入到最接近的 好 数字 我将在下面放置一些代码来演示这一点 但我的问题是我使用了一系列 else if 来查找这个数字 但我无法确定上限 因此这并不是一个好的策略 是否有任何已知的算法或资源可以帮助我 i
  • 使用 Telerik radtreecontrol MVVM 绑定双击方法

    我已经花了很长一段时间来研究这个问题 尽管我内心深处的人说 不要这样做 但现在是时候问路了 我正在使用 MVVM 设计模式在 WPF C 中进行编码 我们尝试严格遵守该模式 并且在后面的代码中不放置任何内容 除非没有选择或者这样做完全不合理
  • 反引号运算符的固定性?

    反引号运算符的固定性是什么 例如在这段代码中现实世界哈斯克尔 http book realworldhaskell org read code case study parsing a binary data format html ghc
  • Django Rest 框架和 Django-Hvad

    所以我需要为我的 DRF API 提供一些模型翻译支持 然后我开始使用 django hvad 它似乎与我的 django 应用程序配合良好 但我在使用 DRF APi 时遇到了一些问题 我正在尝试创建一个简单的 POST 请求 但收到错误
  • R:按数字而不是按字典顺序对 dcast 输出中的列重新排序

    这是关于对包含数字和文本的列名称进行排序 我有一个数据框 其结果是dcast有 200 行 我的订购有问题 列名称采用以下格式 names DF lt c Testname1 1 Testname1 100 Testname1 11 Tes
  • Guvnor规则编码

    我在 Excel 中有一个 Drools 决策表 规则中使用的一些字符串具有 字符 当我从这个决策表在 Guvnor 中构建规则包时 我在规则源中得到了错误的字符 例如 在电子表格中 gt rea de Lazer POR 在内置的 drl
  • 暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?

    我理解这两种方法之间的差异 但我想知道在执行诸如暂停 SpriteKit 游戏之类的操作时 使用 UIApplicationWillResignActive 与 UIApplicationDidBecomeActive 或 UIApplic
  • 无法使用 ngx translate/core 获取文本的动态翻译 - Angular 2 TypeScript

    问题 我有来自 Json 文件的动态文本 我正在使用这样的translate get 方法 this translate get keyInJson subscribe res gt this valueFromJson res creat
  • 在go中读取xz文件

    我怎样才能阅读xz http en wikipedia org wiki Xzgo 程序中的文件 当我尝试使用它们来阅读它们时lzma https code google com p lzma 我得到一个error in lzma head
  • 三元运算符使用哪种编码风格? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从Python字符串中删除括号?

    我从标题中知道您可能会认为这是重复的 但事实并非如此 for id row in enumerate rows columns row findall td teamName columns 0 find a text Lag played
  • 如何在 Visual Studio 中的 CppUnitTestFramework (C++) 中设置超时?

    如何使用 CppUnitTestFramework 在 Microsoft 单元测试中为 C 中的测试方法添加超时 我在网上找到的大多数解决方案都是针对 CSharp 项目的 我可以在其中添加 TEST METHOD TIME OUT 80
  • Gettext/Django 德语翻译:正式/非正式称呼

    我维护一个包含翻译的可插入 Django 应用程序 Python 和 HTML 代码中的所有字符串都是用英语编写的 当将字符串翻译成德语时 我总是与德语区分正式和非正式言语的问题作斗争 请参阅T V 区别 https en wikipedi
  • PyQt:计时器无法从另一个线程启动

    我正在使用 python 制作 Qt GUI 但收到错误 QObject startTimer 无法从另一个线程启动计时器 当我运行 readModemSnap 方法时会发生这种情况 我已经为此工作了近一周 尝试了许多不同的 Qt 线程设计