2017-02-04 12 views
0

Я новичок, пытающийся разработать графический интерфейс с использованием python. Мои данные - файл .sgy, и мне нужно отображать графики в качестве вывода. Я выбрал Pyglet для этого. Это правильный выбор? Я поражен первым шагом, где я хочу отобразить заголовок сейсмических данных в метке в окне. Вот код, который я пробовал:Показать динамическое значение в метке в 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

читать сообщение об ошибке: что такое 'i'? Некоторые следы. Что такое трассировка? Не строка. Но Label требуется строка в качестве первого аргумента. Так что, может быть, вам понадобится 'str (i)' или, может быть, у него есть «i.text» или somthing. – furas

ответ

0

В соответствии с ObsPy documentation есть значение stats каждого элемента в st.

Поскольку st сам по себе представляет собой массив данных, и вы просто извлекаете идентификатор каждого из данных, у вас есть два или три варианта.

Один из них, если бы вы хотите напечатать идентификатор в виде графической этикетки, а затем делать то, что @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, поэтому, возможно, кто-то более опытный с сумасшедшим меня исправит при использовании этих данных.

+0

Благодарим вас за помощь, но при использовании любого из способов, о которых вы упомянули, я получаю определенную ошибку, например, при использовании второго метода, возникшая ошибка: TypeError Traceback (последний последний вызов) в () 15 Я в st.traces: ---> 16 этикетка = pyglet.text.Label (й [я] .stats.segy.trace_header, 17 имя_шрифта = 'Времена New Roman ', 18 font_size = 36, ТипError: объект' SEGYFile 'не имеет атрибута' __getitem__ ' –

+0

Также, поскольку я совершенно новый в программировании с Python, я хочу знать, является ли продвижение вперед с Pyglet хорошим вариантом или нет «Мне нужно разработать очень сложные графические интерфейсы. Есть ли другой способ развития GUI, что-то, что включает в себя виджеты перетаскивания, такие как Visual Studio. Thanxx заранее! –

+0

Вы используете мой код? И вы запускаете его через какую-то среду IDE?Потому что вывод ошибки (traceback) выглядит мне как-то фанк. Это зависит от того, какой пользовательский интерфейс вы пытаетесь сделать. Я бы сказал, если вам просто нужны кнопки и ярлыки, вам лучше работать с wxPython или любой другой библиотекой, которую вы чувствуете. Но это вопрос, который не подходит для stackoverflow (какая библиотека UI для использования), поскольку мы обычно не допускаем вопросов, основанных на мнениях. Я могу помочь вам с этой конкретной проблемой. Но какой код вы использовали, потому что я никогда не использовал 'getitem'. Если 'trace_header', но полный стек plase – Torxed