退出Python RFID线程

2024-04-23 08:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始了一个小项目,目前陷入了一个问题。 我在Tkinter中编写了一个小GUI,当按下按钮以读取RFID芯片的ID时,它会打开另一个线程。然后通过队列对象将其返回到GUI,并通过标签显示。到目前为止,这是可行的

现在我想实现当10秒钟内没有检测到RFID芯片或者线程在这段时间后仍然存在时,线程终止。我曾试图用以下事件来打断这一过程,但没有成功

有人知道这是怎么回事吗

已经谢谢你了

#!/usr/bin/env python3

import tkinter as tk
import queue
import threading
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522

class GUI:

    def __init__(self, master):
        self.master = master
        self.test_button = tk.Button(self.master, command=self.tb_click)
        self.test_button.configure(text="Start", background="Grey", padx=50)
        self.test_button.pack(side='top')
    
        self.test_label = tk.Label(self.master, text="test")
        self.test_label.pack(side='bottom')
    
    def tb_click(self):
        self.stop = threading.Event()
        self.queue = queue.Queue( )
        thread = Rfid(self.queue, self.stop)
        thread.start()
        self.master.after(100, self.process_queue)
        self.master.after(10000, self.terminate)

    def process_queue(self):
        try:
            msg = self.queue.get(0)
            #print(str(msg))
            self.test_label.configure(text=str(msg))      
        except queue.Empty:
            self.master.after(100, self.process_queue)

    def terminate(self):
        if thread.is_alive():
            self.stop.set()

class Rfid(threading.Thread):
    
    def __init__(self, queue, stop):
        threading.Thread.__init__(self)
        self.queue = queue
        self.stop = stop

    def run(self):
        while True:
            if self.stop.isSet():
                print("abgeschalten")
                break
    
            reader = SimpleMFRC522()
            id, text = reader.read()
            print(str(id))  
            self.queue.put(str(text))
            GPIO.cleanup()
      
root = tk.Tk()
root.title("Test")
main_ui = GUI(root)
root.mainloop()

Tags: texttestimportselfmastergpioqueuedef