微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 raspberry pi 键盘线程

如何解决使用 raspberry pi 键盘线程

我是线程的新手,因此对于其中的任何错误,我深表歉意。我正在创建一个 GUI,用户将在其中使用带有树莓派的 4x4 薄膜键盘输入他们的 pin,并且该输入将与他们在数据库中的 pin 进行比较。我目前拥有它,因此当按下按钮时,小键盘代码将在线程中运行。我遇到的问题是,当引脚正确或尝试次数过多时,带有键盘代码的线程仍在运行。我尝试了在网上找到的不同方法来尝试停止线程,如代码所示。

有没有办法停止线程,或者如果我想在用户输入错误/正确时停止代码,我是否必须尝试不同的方法?我将不胜感激。

import threading
import tkinter as tk
from tkinter import font as tkfont
from pad4pi import rpi_gpio
import time
import sys
import RPi.GPIO as GPIO

KEYPAD1 = [
        ["1","2","3","A"],["4","5","6","B"],["7","8","9","C"],["*","0","#","D"]
]

#passcode = "7A7B"
passcode = ""
inp = ""
a = 0

GPIO.setwarnings(False)
ROW_PINS = [5,6,13,19] # BCM numbering;
COL_PINS = [12,16,20,21] # BCM numbering;
factory = rpi_gpio.KeypadFactory()
keypad = factory.create_keypad(keypad=KEYPAD1,row_pins=ROW_PINS,col_pins=COL_PINS)

def PAD(self,val,stop):
    global passcode
    passcode = val
    def pressKey(key):
        global inp # where the key will be added to
        global a # attempts user has made
        if (key == "*"):
            print("Input reset")
            inp = ""
            a += 1
        elif (key == "#"):
            if len(inp) > len(passcode):
                print("Input longer than passcode,resetting")
                inp = ""
                a += 1
            elif (inp == passcode):
                self.label1.destroy()
                inp = ""
                a = 0
                self.controller.show_frame("Access")
                print("Unlocking door")
                time.sleep(5)
                print("Door locked")
                self.controller.show_frame("StartPage")
                stop()
                sys.tracebacklimit=1
                raise ValueError()
            else:
                print("Passcode incorrect")
                inp = ""
                a+=1
        else:
            inp = inp + key
            time.sleep(0.1)
        # after 4 attempts,stops
        if a == 4:
            self.controller.show_frame("Denied")
            print("Too many tries,exitting")
            self.label1.destroy()
            a = 0
            inp = ""
            time.sleep(5)
            self.controller.show_frame("StartPage")
            stop()
            sys.tracebacklimit=1
            raise ValueError()
            
    # pressKey will be called each time a keypad button is pressed
    keypad.registerKeyPressHandler(pressKey)
    while True:
        try:
            time.sleep(0.1)
            if stop():
                break
        except:
            keypad.cleanup()

class SampleApp(tk.Tk):
    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        self.title_font = tkfont.Font(family='Helvetica',size=18,weight="bold",slant="italic")
        container = tk.Frame(self)
        container.pack(side="top",fill="both",expand=True)
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        self.frames = {}
        for F in (StartPage,PageOne,Denied,Access):
            page_name = F.__name__
            frame = F(parent=container,controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0,column=0,sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self,page_name):
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller
        label = tk.Label(self,text="This is the start page",font=controller.title_font)
        label.pack(side="top",fill="x",pady=10)

        button1 = tk.Button(self,text="Go to Page One",command=lambda: controller.show_frame("PageOne"))
        button2 = tk.Button(self,text="Keypad",command=lambda: self.create())
        button1.pack()
        button2.pack()
    
    def create(self):
        self.label1 = tk.Label(self,text = "Please input passcode via keypad")
        self.label1.pack()
        self.after(200,self.key_pad())
    
    def key_pad(self):
        stop_thread = False
        value = "7A7B"
        t = threading.Thread(target=PAD,args=(self,value,lambda: stop_thread))
        t.daemon = True
        t.start()
        stop_thread = True
        t.join()

class PageOne(tk.Frame):
    def __init__(self,text="This is page 1",pady=10)
        button = tk.Button(self,text="Go to the start page",command=lambda: controller.show_frame("StartPage"))
        button.pack()

class Access(tk.Frame):
    def __init__(self,parent)
        self.controller = controller
        self.configure(background = "green")
        label = tk.Label(self,text = "Granted",font = controller.title_font)
        label.pack()
        button = tk.Button(self,text = "Home",command = lambda: self.controller.show_frame("StartPage"))
        button.pack()

class Denied(tk.Frame):
    def __init__(self,parent)
        self.controller = controller
        self.configure(background = "red")
        label = tk.Label(self,text = "denied",command = lambda: self.controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?