QGIS 3.2插件:在QGIS中,QTextBrowser的stderr和stdout失败

时间:2019-02-25 15:11:32

标签: python-3.x pycharm stderr qgis qtextbrowser

在QGIS 3.2 / Python 3.6 / Win 10中工作。

我正在编写一个插件,我希望将stderr和stdout显示在“记录器”中,该记录器是QTextBrowser,可以在QTabWidget的最后一个选项卡中找到。

我浏览了这些论坛以了解操作方法,并找到了可行的解决方案。但是,仅当我在PyCharm中运行/调试代码时,此方法才有效。但是,当我在QGIS中打开插件时,stdout默认返回QGIS python控制台,stderr默认返回QgsMessageBar。

我不知道为什么。设置是否被否决? 在极少数情况下,它可以运行一两次。然后返回到控制台/ QgsMessageBar。所以我想这也许是行动的顺序?

我的代码的相关部分:

class EmittingStream:

    def __init__(self, tab_widget):     # tab_widget is a QTabWidget
        self.tab_widget = tab_widget
        self.log_index = tab_widget.indexOf(tab_widget.findChild(QWidget, 'tab_log'))
        self.log_widget = tab_widget.findChild(QWidget, 'logBrowser')

    def write(self, text):
        self.log_widget.append(text)
        self.tab_widget.setCurrentIndex(self.log_index)


class MyWidget(QDialog):

    def __init__(self):
        super(MyWidget, self).__init__()
        loadUi(os.path.join(os.path.dirname(__file__), 'my_widget.ui'), self)
        sys.stdout = EmittingStream(self.tabWidget)
        sys.stderr = EmittingStream(self.tabWidget)
        ....

    def __del__(self):
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__

0 个答案:

没有答案