Saya cukup baru dalam threading/GUI dan yang saya coba buat adalah dialog yang meminta pengguna untuk memindai kode batang (melalui port serial), dan kemudian mengisi data berdasarkan kode batang tersebut.
Bagian pemindaian dan pengisian tidak ada masalah. Masalah saya adalah segera setelah saya membuka dialog ini, saya mulai membaca dari port serial untuk melihat apakah ada yang telah dipindai. Ini membekukan GUI dan tidak memungkinkan pengguna untuk membatalkan. Jadi setelah sedikit riset, sepertinya saya ingin melakukan threading, tetapi saya tidak dapat menemukannya.
Inilah yang saya punya:
...
self.edit_location = EditLocation(self)
self.edit_location.show()
self.edit_location.wait_for_scan()
class EditLocation(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.ui = ui_edit_location.Ui_EditLocation()
self.ui.setupUi(self)
self.parent = parent
def wait_for_scan(self):
thread = ScanThread()
thread.start()
def receivedBarcode(self, barcode):
print "recieved", barcode
class ScanThread(QThread):
def __init__(self):
QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
barcode = scan_barcode()
self.emit(SIGNAL('receivedBarcode'), barcode)
dan di file pemindaian saya... (menggunakan pyBarcode)
s = serial.Serial(scanner_port)
def scan_barcode():
return s.readline()
GUI masih macet hingga kode batang dipindai. Bantuan apa pun akan sangat dihargai!
thread
. Saya tidak yakin mengapa Anda perlu melakukan ini dengan tepat, tetapi saya berspekulasi bahwa ketika python mencoba mengumpulkan sampah, variabelthread
ia macet pada panggilanself.wait()
di fungsi__del__
. - person hackyday   schedule 12.06.2014QThread.__init__(self, parent)
dan memperbaikinya. Hargai bantuannya! - person jongusmoe   schedule 12.06.2014