相关疑难解决方法(0)

如何正确地将标准输出、日志记录和 tqdm 重定向到 PyQt 小部件中

长话短说

\n

答案请参见:

\n
    \n
  1. 我的 2019 年最初使用文本编辑和 stdout/stderr 流重定向接受了答案,请参阅/sf/answers/3855776501/
  2. \n
  3. 我的第二个答案,现在标记为已接受的答案:使用真正的 QProgressBar 的派生和改进方法!/sf/answers/5186428061/
  4. \n
\n

问题

\n

首先,我知道很多问题都与这个问题类似。\n但是在花了这么多时间之后,我现在向社区寻求帮助。

\n

我开发并使用了一堆依赖于 的 python 模块tqdm。\n我希望它们可以在 Jupyter、控制台或 GUI 中使用。\n在 Jupyter 或控制台中一切正常:日志记录/打印和 tqdm 进度之间没有冲突酒吧。以下是显示控制台/Jupyter 行为的示例代码:

\n
# coding=utf-8\nfrom tqdm.auto import tqdm\nimport time\nimport logging\nimport sys\nimport datetime\n__is_setup_done = False\n\n\ndef setup_logging(log_prefix):\n    global __is_setup_done\n\n    if __is_setup_done:\n        pass\n    else:\n        __log_file_name = "{}-{}_log_file.txt".format(log_prefix,\n                                                      datetime.datetime.utcnow().isoformat().replace(":", "-"))\n\n        __log_format = \'%(asctime)s - %(name)-30s - %(levelname)s - %(message)s\'\n        __console_date_format = \'%Y-%m-%d %H:%M:%S\'\n        __file_date_format = \'%Y-%m-%d %H-%M-%S\'\n\n        root …
Run Code Online (Sandbox Code Playgroud)

python logging stdout pyqt tqdm

10
推荐指数
2
解决办法
9598
查看次数

在python 3.x(使用wxPython GUI)日志中启用未缓冲的输出

我有一个一直在使用的Py3.x GUI应用程序Gooey。该应用程序功能齐全,并且GUI可以按预期工作,但内置控制台/终端接收缓冲的输出除外。

如果我使用来运行.py文件,这不是问题pythonw -u script.py,但是我现在尝试将工具捆绑/冻结到中.app。捆绑过程一直有效,但是在打开应用程序时仍然存在缓冲输出的问题。

到目前为止,我发现了以下内容,但没有尝试过:

  • 一些线程建议在每次调用时使用flush=Truewith print()进行写操作,但是logging-我在这里感兴趣的是-没有这样的互补标志。因此,该线程中的各种猴子修补解决方案对我也没有用(需要注意的是,我对logging井的内部结构并不了解,因此也许对记录器Gooey本身也可以应用类似的方法,并且打包过程输出的日志记录信息比我自己的调用要多得多,并且仍在缓冲中,因此看来“全局取消缓冲”才是真正需要的。

  • 该线程提供了许多方法。确实,建议sys.stdout使用0缓冲区大小的重新打开方法,但是在第一个线程中,根据PIP 3116以及在我看来,使用PIP 3116,它是否仍然可以在Python 3上使用还存在争议。

    nonbuffered_stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
    sys.stdout = nonbuffered_stdout
    
    Run Code Online (Sandbox Code Playgroud)

    似乎.app完全打破了。

  • 尝试将“ a” -uPYTHONUNBUFFERED=1“ shebang ”“注入” ,无论是否带有,都似乎不起作用(在本例中为MacOS)-S


因此,TL; DR

当未显式调用脚本时,如何在Python 3.x中实现无缓冲输出python3 -u

我仍在尝试将MWE gooey组合在一起,但是结合使用打包过程会使这变得有些困难。

python wxpython output-buffering

5
推荐指数
0
解决办法
130
查看次数

PySide和python日志记录

我想使用PySide创建一个简单的应用程序,只是为了从python日志记录输出.

def mpm_print():
    print 'OK'

def mpm_log():
   log.info('OK')

class LabWindow(QtGui.QMainWindow):
    def __init__(self):
        super(LabWindow, self).__init__()

        self.initUI()
        mpm_print()
        mpm_log()

    def initUI(self):

        font = QtGui.QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(10)

        self.qtxt = QtGui.QTextEdit(self)
        self.qtxt.resize(self.size())
        self.qtxt.setReadOnly(True)
        self.qtxt.setFont(font)

        self.resize(640, 512)
        self.setWindowTitle('Efficient Algorithms Lab')

        self.show()
Run Code Online (Sandbox Code Playgroud)

我想知道:

  • 如何重定向stdout以写入QTextEdit?
  • 如何编写logging.Handler来登录QTextEdit?

谢谢

python qt pyside

3
推荐指数
1
解决办法
4086
查看次数

PyQt崩溃为Windows APPCRASH

我有一个非常短的PyQt程序(这是一个PythonFiddle链接 - 这似乎在Firefox中崩溃,所以代码也发布在下面),它打印输出到QTextEdit(使用来自这个SO答案的代码).当我运行代码(在Windows上)时,它会导致APPCRASH.一些观察:

  • 如果我添加一个time.sleep调用(即取消注释第53行),则程序完成正常
  • 如果我不将输出重定向到QEdit(即注释掉第34行),那么无论time.sleep呼叫是否被注释掉,它都能正常工作

我认为这意味着重定向的代码stdout以某种方式被破坏了 - 但是我很难理解它导致这种行为的错误 - 任何指针都感激不尽!


完整的错误消息

问题签名:
问题事件名称:APPCRASH
应用程序名称:pythonw.exe
应用程序版本:0.0.0.0
应用程序时间戳:5193f3be
故障模块名称:QtGui4.dll
故障模块版本:4.8.5.0
故障模块时间戳:52133a81
异常代码:c00000fd
异常偏移: 00000000005cbdb7
OS版本:6.1.7601.2.1.0.256.48
区域设置ID:2057
附加信息1:5c9c
附加信息2:5c9c27bb85eb40149b414993f172d16f
附加信息3:bc7e
附加信息4:bc7e721eaea1ec56417325adaec101aa


Pythonfiddle在Firefox上崩溃(至少对我而言),所以下面的代码也是如此:

import os, sys, time, calendar, math
from PyQt4 import QtCore, QtGui

class EmittingStream(QtCore.QObject): 
  textWritten = QtCore.pyqtSignal(str)

  def write(self, text): self.textWritten.emit(str(text))

class myWrapper(QtGui.QMainWindow):

  def __init__(self):
    super(myWrapper, self).__init__()
    self.toolbar = self.addToolBar("MainMenu")
    self.toolbar.addAction(QtGui.QAction("myProg", self, triggered=self.myProgActions))

  def myProgActions(self): self.setCentralWidget(myWidget())

class myWidget(QtGui.QWidget):

  def __init__(self): …
Run Code Online (Sandbox Code Playgroud)

python pyqt

3
推荐指数
1
解决办法
2619
查看次数

如何动态更新QTextEdit

所以我在GUI的主窗口中有一个QTextEdit.我希望通过从远程更新列表中提取来更新此文本.我不知道如何无限地检查这个列表,没有a)做无限循环或b)线程.

a)崩溃GUI,因为它是无限循环b)产生错误说:

QObject: Cannot create children for a parent that is in a different thread.
Run Code Online (Sandbox Code Playgroud)

我明白了

我该怎么做才能解决这个问题?

python pyqt pyqt4 qtextedit

2
推荐指数
1
解决办法
2万
查看次数

标签 统计

python ×5

pyqt ×3

logging ×1

output-buffering ×1

pyqt4 ×1

pyside ×1

qt ×1

qtextedit ×1

stdout ×1

tqdm ×1

wxpython ×1