那么,我正在努力做的事情: 我有一个充当显示器的设备,虽然在技术上不是一个(这不是很重要,它可以像普通显示器一样处理),我想在其上显示一系列图像。当显示每个图像时,我调用一个从另一个设备读取数据的函数。到目前为止,我已经使用了pyglet,我可以让它以正确的顺序和我想要的位置显示图像,但所读取的读数似乎与正确的图像不对应。
解释我想做的最简单的方法是:
for a in range(10):
display('image%d'%a)
values(a) = measure()
想象一下,价值是以正确的形式启动的。
到目前为止我尝试的是:
import pyglet
import numpy as np
size = 64
no = 512/size
a,b,c = (0,0,0)
values = np.zeros((no,no,3))
display = pyglet.window.get_platform().get_default_display()
screens = []
for screen in display.get_screens():
screens.append(screen)
window = pyglet.window.Window(screen = screens[1], fullscreen=1)
#here i choose the mentioned device, since it is connected to my computer via display port
@window.event
def update(dt):
global a,b,c
if a == no/2. and b == no/2.:
values[a,b,c] = 0
window.clear()
else:
image = pyglet.image.load('folder_%d/grating_%d_%d_%d.bmp' % (size,a,b,c))
window.clear()
print (a,b,c)
image.blit(0,0)
values[a,b,c] = measure()
c+=1
if c == 3:
b += 1
c = 0
if b == no:
a += 1
b = 0
if a == no:
pyglet.app.exit()
pyglet.clock.schedule_interval(update, .2)
pyglet.app.run()
其中measure()是我自己的函数。 “no”是我的图像的索引,它们的范围从(0,0,0),(0,0,1),(0,0,2),(0,1,0)...到(否) ,不,2)并被称为逐个调用。我认为a = b = no / 2的情况也是一个特殊情况,对我的问题并不特别重要。
首先:我很确定这既不优雅也不高效,但我不是在创造其他任何人都可能使用的软件。我也知道使用全局变量是不好的做法,但是它们的使用是由于我不知道如何正确使用eventloops。
我对此解决方案不满意,因为我所采用的读数似乎总是与之前的图像相对应。 我想我错误地使用了eventloop,但是pyglet文档在这里并没有真正帮助我。 此外,我觉得我正在建造一辆整车,只是为了在街对面搬运行李......
我已经将pyplot作为一种替代方案,因为imshow()函数以我想要的方式工作,但是绘图库似乎以随机大小显示图像,我无法弄清楚如何正确控制。
我非常感谢正确使用pyglet以及可以提供帮助的替代库。
谢谢你,
Mopsi
答案 0 :(得分:0)
从您的示例中,您不需要a,b,c
函数之外的update
,并且所有global
内容都是关于在调用中保持活动的值。如果我正确的话,这更适合闭包,比如
...
def make_update(no, window):
from itertools import product
abcs = product(range(no),range(no),range(3))
@window.event
def _update(...):
try:
a, b, c = next(abcs)
except StopIteration:
... wind up ...
...
return _update
update = make_update(no, window)
...
答案 1 :(得分:0)
好吧,我实际上没有解决问题,但找到了解决方法: 我只是压扁了我的图像命名法,例如
0_0_0 -> 000
0_0_1 -> 001
0_0_2 -> 002
0_1_0 -> 003
etc.
现在值为具有维度[no * no * 3,1]
的数组因为对于第n次迭代并且因此第n次测量,我看到第(n-1)个图像,我只是添加虚拟图像并将第n个测量值分配给值[n-1]。 第一次测量是无用的,这里没有问题,因为值[-1]是最后一个元素,最后会被有意义的测量覆盖。
由于图像的数量是已知的和预定的,我可以在之后重塑我的数组值。
如果有人在意解释为什么没有显示的图像被移动一次(第一次迭代时根本没有显示图像),请继续。