Python控制台输出与Spyder控制台不同
我有一段Python代码,它可以从HP LCR表中获取测量数据,并以不同的方式收集这些数据。最近,我为那些不太会修改代码变量的员工创建了一个图形用户界面(GUI),让他们可以输入初始条件。现在一切都正常,除了一个问题。我们使用的是最新的Python xy,也就是Python 2.6.6,搭配PyQt和Spyder,在Windows 7的电脑上运行。
通常我们会在Spyder中打开代码,但打开Spyder需要一些时间,我的主管更喜欢直接双击文件,这样就能打开带有Python控制台窗口的GUI,控制台可以打印错误信息和其他信息,就像在Spyder中看到的一样。
从提供的截图可以看到,有一个初始机器设置模式,用于设置要被LCR表扫描的设备,并且代码会提示用户输入两个内容。在Spyder中,这些提示在控制台中显示得很好,但在没有Spyder的Python控制台中,它不断打印 QCoreApplication::exec: The event loop is already running
。奇怪的是,你仍然可以像往常一样按两次回车,代码就会正常运行。但这对除了我以外的所有人来说都会很困惑。
有没有人知道为什么会出现这种情况?
这是提示输入的代码。
lcr = visa.instrument('GPIB::17')
#clear the instrument
lcr.write('*RST;*CLS')
#enable operation complete notification
lcr.write('*OPC')
if parallel:
lcr.write('FUNC:IMP CPG') #Parallel capacitance, conductance model
else:
lcr.write('FUNC:IMP CSRS') #Series capacitance, resistance model
lcr.write('APER '+integration+','+averages)
lcr.write('OUTP:HPOW ON')
lcr.write('OUTP:DC:ISOL OFF')
lcr.write('VOLT '+vac)
lcr.write('TRIG:SOUR BUS')
if zero == True:
#set open correction parameters
lcr.write('DISP:PAGE CSET')
lcr.write('CORR:LENG 1')
lcr.write('CORR:METH SING')
lcr.write('CORR:LOAD CPG')
lcr.write('CORR:USE 10')
lcr.write('CORR:SPOT1:STATE ON')
lcr.write('CORR:SPOT2:STATE OFF')
lcr.write('CORR:SPOT3:STATE OFF')
lcr.write('CORR:SPOT1:FREQ '+frequency)
#perform open correction -> unprobe device\
raw_input('Unprobe DUT and press ENTER to continue...')
lcr.write('CORR:SPOT1:OPEN')
lcr.write('CORR:OPEN:STATE ON')
lcr.write('DISP:PAGE MEAS')
#poll lcr to determine measurment state
lcr.write('*OPC?')
done = lcr.read()
while done == 0:
lcr.write('*OPC?')
done = lcr.read()
time.sleep(0.5)
#reprobe device
raw_input('Probe DUT, then press ENTER')
lcr.write('FREQ '+frequency)
这些提示就是两个 raw_input()
。
1 个回答
你在控制台里看到不断的消息,是因为系统日志和你的应用程序使用的是同一个输出流。
Spyder是一个很不错的程序,它在QT窗口中嵌入了IPython或Python(作为备份)控制台。你也可以用类似的方法,只需使用Qt4来绘制一个窗口,其中包含IPython控制台。
你需要做的事情是这个(来源):
def embed_ipython(window):
"wrapper funcs - works < IPython 0.11"
from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed(user_ns = dict(w = window))
ipshell()
这里的‘window’是你想要暴露给IPython的一个中心对象(用于操作、测试各种方法等)。
GUI应用程序的初始化大致是这样的:
if __name__ == "__main__":
import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
embed_ipython(window)
sys.exit(app.exec_())
一些额外的阅读资料:
- QT4教程:http://zetcode.com/tutorials/pyqt4/firstprograms/
- 类似主题 - 如何嵌入Python控制台:如何在PyQT小部件中嵌入Python解释器
- IPython和QT控制台:http://ipython.org/ipython-doc/dev/interactive/qtconsole.html