[PyQt] Re: Wait Dialog and pyserial
Ruslan Popov
ruslan.popov at gmail.com
Tue Dec 1 19:16:57 GMT 2009
The answer is:
Just read carefully about QEvent and QCoreApplication.postEvent and you've
know that there is no need to use QWaitCondition at all in this case.
On Tue, Dec 1, 2009 at 10:15 PM, Ruslan Popov <ruslan.popov at gmail.com>wrote:
> Hi, all.
>
> I am working on a part of application, the app needs to read RFID id from
> label, RFID reader is accessible via COM port (I've used pyserial for that).
>
> I have tried to do so:
>
> [main code]
> class MainWindow(QMainWindow):
>
> def __init__(self, parent=None):
> QMainWindow.__init__(self, parent)
>
> self.rfidReader = QWaitCondition()
> self.rfidWaiter = QWaitCondition()
> self.rfidMutex = QMutex()
> self.callback = self.readedRFID
> self.reader = WaitingRFID(self)
> self.reader.start()
>
> ..
>
> def waitingRFID(self):
> self.rfidReader.wakeAll()
>
> self.dlg = DlgWaitingRFID()
> self.dlg.setModal(True)
> self.dlg.exec_()
>
> #self.rfidMutex.lock()
> #self.rfidWaiter.wait(self.rfidMutex)
> #self.rfidMutex.unlock()
>
> def readedRFID(self, rfid):
> self.rfid_id = rfid
> print 'readedRFID:', rfid
> #self.rfidWaiter.wakeAll()
> self.dlg.close()
>
> [Thread code]
> class WaitingRFID(QThread):
> def __init__(self, parent):
> self.callback = parent.callback
> self.mutex = parent.rfidMutex
> self.condition = parent.rfidReader
> QThread.__init__(self)
>
> def hex(self, symbol):
> return '%02X' % ord(symbol)
>
> def run(self):
> while True:
> port = serial.Serial(PORT['name'], PORT['rate'],
> bytesize = PORT['bits_in_byte'],
> parity = PORT['parity'],
> stopbits = PORT['stop_bits']
> )
> port.setDTR(True)
> port.setRTS(True)
>
> self.mutex.lock()
> self.condition.wait(self.mutex)
>
> buffer = []
> while True:
> symbol = port.read(1)
> if not self.hex(symbol) == '0D':
> buffer.append(symbol)
> else:
> if '0A' == self.hex(port.read(1)):
> if len(buffer) == 9:
> rfid_code = ''.join(buffer[1:]) # see
> manager.py
> break
> buffer = []
>
> self.callback(rfid_code)
> self.mutex.unlock()
>
> port.close()
>
> Thread code works well. The problem is in showing dialog.
> I need to show dialog with a label 'Put RFID label on the reader.' and run
> thread's loop. The loop reads RFID id and use callback function. At this
> point I need to close the dialog window. Tell me the right way to do it.
>
> Any help appreciated,
> --
> Ruslan Popov
> phone: +7 916 926 1205
>
>
--
Ruslan Popov
phone: +7 916 926 1205
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20091201/3c0957e1/attachment.html
More information about the PyQt
mailing list