Установить атрибут в потоке python из свойств

Я новичок в python, и я реализую простое серийное объявление в потоке. Я могу запрашивать данные, используя класс

class CaptureAngles(threading.Thread, port)
 def __init__(self):
 threading.Thread.__init__(self)
 self.port_name = port
 ...

 def run():
 self.connect(self.port_name)
 ...

Однако для лучшей интеграции с графическим интерфейсом с использованием библиотеки признаков я написал код как следующий, который больше не работает. Я не могу определить атрибут потока, который запускается из свойств, что я делаю неправильно?

Это сообщение об ошибке

AttributeError: объект CaptureAngles не имеет атрибута 'port_name'

И это полный код:

from threading import Thread
from time import sleep
from enthought.traits.api import *
from enthought.traits.ui.api import View, Item, ButtonEditor
from Queue import Queue

class TextDisplay(HasTraits):
 string = String()

 view= View( Item('string',show_label=False, springy=True, style='custom' ))


class CaptureAngles(Thread):
 self.port_name = String('COM5') 

 def connect(self, port_name):
 self.port = serial.Serial(
 port = port_name,
 baudrate = 9600,
 ) 
 self.display.string='Opening Serial Port...' + self.display.string
 self.port.close()
 self.port.open()

 def run(self):
 self.connect(self.port_name)
 self.display.string = '******* started\n' + self.display.string
 self.port.flushInput()
 self.port.flushOutput()
 self.port.readline() # Discard first package (can be corrupt)
 while not self.wants_abort:
 rcv = self.port.readline() # Read the data and split into words 
 angle = int(rcv)
 self.display.string = '%d angle captured\n' % n_img \
 + self.display.string
 self.close()

 def close(self):
 self.port.close()
 self.display.string='...Serial Port Closed!' + self.display.string


class *******(HasTraits):
 start_stop_capture = Button()
 display = Instance(TextDisplay)
 capture_angles = Instance(CaptureAngles)
 capture_angles.port_name = 'COM5'
 view = View(Item('start_stop_capture', show_label=False ))

 def _start_stop_capture_fired(self):
 if self.capture_angles and self.capture_angles.isAlive():
 self.capture_angles.wants_abort = True
 else:
 self.capture_angles = CaptureAngles()
 self.capture_angles.wants_abort = False
 self.capture_angles.display = self.display
 self.capture_angles.start()

class MainWindow(HasTraits):
 display = Instance(TextDisplay, ())

 ******* = Instance(*******)

 def _*******_default(self):
 return *******(display=self.display)

 view = View('*******','display', style="custom", resizable=True)

if __name__ == '__main__':
 MainWindow().configure_traits()
1 ответ

Хорошо, я понял: перед созданием экземпляра я добавлял атрибут имя_порта.

class *******(HasTraits):
 start_stop_capture = Button()
 display = Instance(TextDisplay)
 capture_angles = Instance(CaptureAngles)
 capture_angles.port_name = 'COM5' # <-- wrong: the object is not created yet
 ...

вместо:

def _start_stop_capture_fired(self):
 if self.capture_angles and self.capture_angles.isAlive():
 self.capture_angles.wants_abort = True
 else:
 self.capture_angles = CaptureAngles()
 self.capture_angles.port_name = 'COM5' # <-- correct
 ...

licensed under cc by-sa 3.0 with attribution.