我正在做一个小程序,从一个网店获得最新的收入,如果它比以前的数额多,它发出声音,我正在使用Pyglet,但我得到错误,因为它不是从主线程调用的。我想知道如何在主线程上调用方法。参见下面的错误:
'thread that imports pyglet.app' RuntimeError: EventLoop.run() must be called from the same thread that imports pyglet.app
def work ():
threading.Timer(5, work).start()
file_Name = "save.txt"
lastRevenue = 0
data = json.load(urllib2.urlopen(''))
newRevenue = data["revenue"]
if (os.path.getsize(file_Name) <= 0):
with open(file_Name, "wb") as f:
f.write('%d' % newRevenue)
f.flush()
with open(file_Name, "rb") as f:
lastRevenue = float(f.readline().strip())
print lastRevenue
print newRevenue
f.close()
if newRevenue > lastRevenue:
with open(file_Name, "wb") as f:
f.write('%f' % newRevenue)
f.flush()
playsound()
def playsound():
music = pyglet.resource.media('cash.wav')
music.play()
pyglet.app.run()
work()
这并不奇怪。
work
正在作为导入pyglet
的独立线程执行。在pyglet.app
导入时会设置很多上下文变量,而不是。我这么说并不是因为我没有深入研究它的实际设置。在而且OpenGL不能在它自己的上下文(它所在的主线程)之外执行事情。因为你不允许在OpenGL上从一个相邻的线程上到处闲逛。如果有道理的话。在
但是,如果您创建自己的
.run()
函数并使用基于类的方法激活Pyglet,则可以从线程启动GUI。在这是如何设置的一个有效示例:
请注意,您仍然需要从线程中启动实际的GUI代码。在
我强烈建议你这样做
考虑到混合线程和GUI调用是一个很滑的斜坡,我建议您使用更谨慎的方法。在
^{pr2}$这是你要找的东西的草稿。
基本上是某种事件/标志驱动的后端,线程和GUI可以用来彼此通信。在
实际上,你有一个工作线程(就像你之前做的那样),它每5秒检查你想要的任何文件,如果它检测到
newRevenue > lastRevenue
,它将为True
设置一个特定的标志。你的主循环将检测到这个变化,播放一个声音并将标志恢复为False。在我并不是故意在这里包含任何错误处理,我们是来帮助的,而不是创建完整的解决方案。我希望这对你有帮助。在
相关问题 更多 >
编程相关推荐