gpt4 book ai didi

python - IPython 手动迭代主循环?

转载 作者:太空狗 更新时间:2023-10-30 01:24:01 24 4
gpt4 key购买 nike

我能否以某种方式实例化 ipython(或更好的 ipython-qtconsole)并手动执行其(IPython 的)主循环?

我想即时编辑 panda3d 程序。

编辑1:这是代码示例,它应该澄清一点我想做什么。

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()

所以你可以看到我如何手动通过 panda 和 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)

在您的命令行中,只需转到文件所在的目录并执行

  1. ipython
  2. 运行 file.py
  3. app.m.setPos(1,1,1)

最佳答案

“即时编辑 panda3d 程序”,您的意思是为了测试正在运行的程序而进行更改吗?或者实际上在交互式环境中对程序结构进行持续编辑?

在交互式 python session 中简单地跳过循环非常容易。您可以将 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()

在主循环中使用 if __name__ == "__main__" ,您的文件在独立运行时仍将正常工作。但现在您可以将其导入交互式 session 并在步骤之间修改内容。

>>> import myfile
>>> app = myfile.MyApp()
>>> app.step()
>>> app.something = something_else
>>> app.step()

现在要将它添加到 IPython 的事件循环中,以便它在您使用解释器时运行,您可以使用 IPython.lib.inputhook.set_inputhook()(IPython 0.11 中的新功能)。

>>> from IPython.lib import inputhook
>>> inputhook.set_inputhook(app.step)

这应该会导致您的程序在解释器空闲时运行,但仍然允许像往常一样进行操作。

关于python - IPython 手动迭代主循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com