我可以以某种方式实例ipython(或甚至更好,ipython-qtconsole)并手动执行它的(IPython)主循环吗?
我想动态编辑panda3d程序.
EDIT1:这是代码示例,应该澄清一下我想做什么.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.qtApp = QApplication(sys.argv)
label = QLabel("Hello World")
label.show()
self.m = loader.loadModel("frowney")
self.m.reparentTo(render)
while 1:
self.qtApp.processEvents() #manual step trough Qt loop
taskMgr.step() #manual step trough Panda3D loop
app = MyApp()
Run Code Online (Sandbox Code Playgroud)
所以你可以看到我如何手动步入熊猫和qt,如果可能的话我想和ipython一样.
答案 完整档案:
from direct.showbase.ShowBase import ShowBase
from IPython.lib import inputhook
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.m = loader.loadModel("frowney")
self.m.reparentTo(render)
def stepMe(self):
taskMgr.step() #manual step trough Panda3D loop
return 0
if __name__ == "__main__":
app = MyApp()
inputhook.set_inputhook(app.stepMe)
Run Code Online (Sandbox Code Playgroud)
在你的cmd行中,只需转到文件所在的目录即可
ipythonrun file.pyapp.m.setPos(1,1,1)通过“即时编辑 panda3d 程序”,您只是指更改内容以测试正在运行的程序吗?或者实际上在交互式环境中对程序的结构进行持久编辑?
在交互式 Python 会话中简单地跳过循环非常容易。您只需替换while 1:为方法声明(例如 )def step(self):,然后为每个步骤调用它。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.qtApp = QApplication(sys.argv)
label = QLabel("Hello World")
label.show()
self.m = loader.loadModel("frowney")
self.m.reparentTo(render)
def step(self):
self.qtApp.processEvents() #manual step trough Qt loop
taskMgr.step() #manual step trough Panda3D loop
return 0 #PyOS_InputHook expects an integer
if __name__ == "__main__":
app = MyApp()
while 1: app.step()
Run Code Online (Sandbox Code Playgroud)
使用if __name__ == "__main__"for 主循环,您的文件在独立运行时仍将正常工作。但现在您可以将其导入交互式会话并在步骤之间修改内容。
>>> import myfile
>>> app = myfile.MyApp()
>>> app.step()
>>> app.something = something_else
>>> app.step()
Run Code Online (Sandbox Code Playgroud)
现在将其添加到 IPython 的事件循环中,这样它将在您使用解释器时运行,您可以使用IPython.lib.inputhook.set_inputhook()(IPython 0.11 中的新增功能)。
>>> from IPython.lib import inputhook
>>> inputhook.set_inputhook(app.step)
Run Code Online (Sandbox Code Playgroud)
这应该会导致您的程序在解释器空闲时运行,但仍允许照常进行操作。
| 归档时间: |
|
| 查看次数: |
2014 次 |
| 最近记录: |