เธรดและ PyQT

ฉันค่อนข้างใหม่กับเธรด/GUI และสิ่งที่ฉันพยายามสร้างคือกล่องโต้ตอบที่ขอให้ผู้ใช้สแกนบาร์โค้ด (ผ่านพอร์ตอนุกรม) จากนั้นจะเติมข้อมูลตามบาร์โค้ดนั้น

การสแกนและการเติมชิ้นส่วนนั้นไม่มีปัญหา ปัญหาของฉันคือทันทีที่ฉันเปิดกล่องโต้ตอบนี้ ฉันเริ่มอ่านจากพอร์ตอนุกรมเพื่อดูว่ามีอะไรถูกสแกนหรือไม่ สิ่งนี้จะทำให้ GUI ค้างและไม่อนุญาตให้ผู้ใช้ยกเลิก หลังจากค้นคว้ามาสักพักแล้ว ดูเหมือนว่าฉันอยากจะทำเกลียวบ้าง แต่ก็คิดไม่ออก

นี่คือสิ่งที่ฉันมี:

    ...
    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)

และในไฟล์สแกนของฉัน... (ใช้ pyBarcode)

s = serial.Serial(scanner_port)   
def scan_barcode():
    return s.readline()

GUI ยังคงค้างจนกว่าจะสแกนบาร์โค้ด ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก!


person jongusmoe    schedule 11.06.2014    source แหล่งที่มา
comment
คงการอ้างอิงถึง thread ฉันไม่แน่ใจว่าทำไมคุณต้องทำสิ่งนี้อย่างแน่นอน แต่ฉันคิดว่าเนื่องจาก python พยายามรวบรวมตัวแปร thread แบบขยะ มันจึงติดอยู่กับการเรียก self.wait() ในฟังก์ชัน __del__   -  person hackyday    schedule 12.06.2014
comment
ขอบคุณ! ฉันทำอย่างนั้นและฉันก็ส่งผ่าน 'parent' ไปยัง QThread และทำ QThread.__init__(self, parent) และนั่นก็แก้ไขได้ ขอขอบคุณสำหรับความช่วยเหลือ!   -  person jongusmoe    schedule 12.06.2014