从 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()
我正在开发一个非常简单的 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()