在pyglet中显示标签中的动态值

时间:2017-02-04 08:16:41

标签: python user-interface pyglet

我是新手尝试使用python开发GUI。我的数据是.sgy文件,我需要将图形显示为输出。我选择了Pyglet这样做。这是一个正确的选择吗?我在第一步中感到震惊,我希望在窗口的标签中显示地震数据的标题。这是我尝试过的代码:

import pyglet      
import sys     
import numpy as np            #package for numerical processing    
import matplotlib             #package for plotting graphs    
import obspy                  #package for reading sgy file   
import pandas                 #package for handling csv file   
from obspy.io.segy.segy import _read_segy    
from obspy.core.util import get_example_file    


window = pyglet.window.Window()    

filename = get_example_file("/home/khyati/Downloads/FindTrappedMiners.SGY")   

st = _read_segy(filename)    

for i in st.traces:    
    label = pyglet.text.Label(i,   
                          font_name='Times New Roman',    
                          font_size=36,   
                          x=window.width//2,   
                          y=window.height//2,   
                          anchor_x='center', anchor_y='center')   


@window.event    
def on_draw():    
    window.clear()    
    label.draw()    

pyglet.app.run()   

这是我遇到的错误

TypeError                                 Traceback (most recent call last)    
<ipython-input-32-869a2d62b820> in <module>()    
     21                           x=window.width//2,   
     22                           y=window.height//2,    
---> 23                           anchor_x='center', anchor_y='center')   
     24    
     25 

/home/khyati/anaconda2/lib/python2.7/site-packages/pyglet-1.2.4-py2.7.egg/pyglet/text/__init__.py in __init__(self, text, font_name, font_size, bold, italic, color, x, y, width, height, anchor_x, anchor_y, align, multiline, dpi, batch, group)    
    428    
    429         '''    
--> 430         document = decode_text(text)   
    431         super(Label, self).__init__(document, x, y, width, height, 
    432                                     anchor_x, anchor_y,    

/home/khyati/anaconda2/lib/python2.7/site-packages/pyglet-1.2.4-py2.7.egg/pyglet/text/__init__.py in decode_text(text)   
    210     '''   
    211     decoder = get_decoder(None, 'text/plain')     
--> 212     return decoder.decode(text)  
    213   
    214 class DocumentLabel(layout.TextLayout):    

/home/khyati/anaconda2/lib/python2.7/site-packages/pyglet-1.2.4-py2.7.egg/pyglet/text/formats/plaintext.py in decode(self, text, location)   
     44     def decode(self, text, location=None):   
     45         document = pyglet.text.document.UnformattedDocument()    
---> 46         document.insert_text(0, text)   
     47         return document    

/home/khyati/anaconda2/lib/python2.7/site-packages/pyglet-1.2.4-py2.7.egg/pyglet/text/document.py in insert_text(self, start, text, attributes)    
    422     
    423         '''    
--> 424         self._insert_text(start, text, attributes)    
    425         self.dispatch_event('on_insert_text', start, text)   
    426       

/home/khyati/anaconda2/lib/python2.7/site-packages/pyglet-1.2.4-py2.7.egg/pyglet/text/document.py in _insert_text(self, start, text, attributes)     
    426       
        427     def _insert_text(self, start, text, attributes):    
    --> 428         self._text = u''.join((self._text[:start], text, self._text[start:]))     
        429         len_text = len(text)    
        430         for element in self._elements:     

    TypeError: sequence item 1: expected string or Unicode, SEGYTrace found    

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据ObsPy documentationstats中的每个元素都有st值。

由于st本身似乎是一个数据数组,并且您只是提取每个数据的ID,因此您有两个或三个选项。

一,如果你想将ID作为图形标签打印,那就去做@furas所说的:

for i in st.traces:
    label = pyglet.text.Label(str(i),
                      x=window.width//2,
                      y=window.height//2,
                      anchor_x='center', anchor_y='center')

或者,您可以通过两个选项提取要显示的数据:

label = pyglet.text.Label(st.traces[i].data, ...)

label = pyglet.text.Label(st[i].stats.segy.trace_header, ...)

无论哪种方式,您的主要问题是pyglet.text.Labelstr作为text参数。你可以插入一个整数作为第一个参数。转换int或使用跟踪文件中的文本表示数据。

另请注意,通过执行for i in x: label = <insert label>,您需要更换每个循环上的标签,并且您在on_draw()功能之外执行此操作,这意味着您将会这样做只创建一个标签。也许你已经意识到这一点,或者它是故意的,但值得一提。

免责声明:我从未与 obspy 合作,我和Pyglet一起工作过很多,所以也许对obspy更有经验的人会纠正我对这些数据的使用。