我是新手尝试使用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
任何帮助都将不胜感激。
答案 0 :(得分:0)
根据ObsPy documentation,stats
中的每个元素都有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.Label将str
作为text
参数。你可以插入一个整数作为第一个参数。转换int或使用跟踪文件中的文本表示数据。
另请注意,通过执行for i in x: label = <insert label>
,您需要更换每个循环上的标签,并且您在on_draw()
功能之外执行此操作,这意味着您将会这样做只创建一个标签。也许你已经意识到这一点,或者它是故意的,但值得一提。
免责声明:我从未与 obspy 合作,我和Pyglet一起工作过很多,所以也许对obspy更有经验的人会纠正我对这些数据的使用。