从 Spyder 中的 QTDialog window 中执行时 print() 的不正确行为

Incorrect behaviour of print() when executed from within a QTDialog window in Spyder

我正在开发一个非常简单的 explore/graph csv 文件界面。我的最终目标是探索,而不是构建软件,因为我不是开发人员,更多的是 "desperate user" :-)

我正在利用找到的代码 in this example

这些是我在 Python 和 GUI 中的第一步,所以我倾向于在我的调用中放置打印消息,这样我可以或多或少地跟踪正在发生的事情。如果我 运行 Spyder 中的代码,这就是我发现奇怪行为的地方。

import sys
import os
from PyQt4 import QtGui
import pandas as pd
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt

# QtGui.QDialog

class Window(QtGui.QDialog):

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

        # a figure instance to plot on
        self.figure = plt.figure()

        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)

        # this is the Navigation widget
        # it takes the Canvas widget and a parent
        self.toolbar = NavigationToolbar(self.canvas, self)

        # Just some extra button to mess around
        self.button= QtGui.QPushButton('Push Me')
        self.button.clicked.connect(self.do_print)

        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        self.setLayout(layout)


    def do_print(self):
        print('Hello World!!')


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    main = Window()
    main.show()

    sys.exit(app.exec_())

奇怪的是,如果我按下按钮 一次,Ipython 控制台上没有任何反应。到我第二次按下时,出现 两个 "Hello World!" 打印输出。

另一方面,如果我只是从 Windows Shell:

中启动我的脚本

python my_simple_test.py

然后一切正常。

然后我在 Spyder 中做错了什么?

谢谢, 米歇尔

IPython 缓冲 ​​stdout 与终端有点不同。当打印某些东西时,它会查看自上次刷新缓冲区以来已经过了多长时间,如果它比某个阈值长,它会再次刷新它。所以你第二次点击按钮时,它会刷新标准输出,你会看到两个输出。

你可以像这样强制它立即刷新:

print('Hello World!!')
sys.stdout.flush()