从Spyder的QTDialog窗口执行时print()的行为不正确

时间:2015-07-27 09:27:12

标签: pyqt ipython spyder

我正在开发一个非常简单的界面来探索/绘制csv文件。我的目标是最终探索,而不是建立软件,因为我不是开发人员,更像是一个绝望的用户" : - )

我正在利用找到的代码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中做错了什么?

谢谢, 米歇尔

1 个答案:

答案 0 :(得分:0)

IPython缓冲stdout与终端有点不同。当打印某些内容时,它会查看自上次刷新缓冲区以来已经过了多长时间,如果它超过某个阈值,则会再次刷新它。因此,第二次单击按钮时,它会刷新标准输出,并且您会看到两个输出。

您可以强制它立即冲洗:

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