第二个托盘图标消息弹出窗口崩溃应用程序

时间:2017-12-11 14:49:24

标签: python python-3.x pyqt5

我正在构建一个可以在Linux上使用Python 3和PyQt5“最小化到托盘”的应用程序。隐藏后,trayIcon.showMessage()显示的消息被解除,尝试显示第二条消息会导致分段错误。

该应用程序会监视文件的更改,并通知用户该匹配项的出现位于特定的正则表达式中。当它被隐藏时,通过带有托盘图标的消息向用户显示这些事件。 起初我认为这是由于控制台中的QObject::startTimer: Timers can only be used with threads started with QThread等消息导致窗口被隐藏时出现的一些线程问题的结果(我不知道为什么会发生这种情况,我没有创建任何线程),所以我决定只在窗口可见的情况下更新窗口,但这不起作用。

我能够将其缩小到触发消息的行:

if self.trayIcon.isVisible():
    print("about to show message")
    print(self.fileContentsList[-1])
    self.trayIcon.showMessage(
        "New match!",
        self.fileContentsList[-1])

但我不确定为什么会发生分段错误。我试过谷歌搜索,但似乎我的情况有点独特。可能是什么问题?

编辑:我忘记添加的内容:使用strace(strace python3 logwatch.py)运行应用程序会以某种方式停止发生分段错误。

EDIT2:代码可在GitHub https://github.com/tehlordvortex/logwatch/上找到

EDIT3: PyCharm控制台中显示的具体行是:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

EDIT4:似乎将它附加到任何形式的调试器可以防止崩溃。我试过PyCharm的调试器和valgrind。

1 个答案:

答案 0 :(得分:0)

我修好了。正如我最初想的那样,这是一个线程问题。

来自监视程序模块的Observer在另一个线程上运行,这是额外线程的来源。我重写了我的Watch类,通过applyBatch()通知我的Window,而不是直接调用回调。这使得回调在主线程上运行。

此修复程序在this commit中列出。如果有更好的方式或其他方式,我非常想知道。

相关问题