Как я могу использовать Raspberry Pi RFID Scaner, чтобы открыть кадр Tkinter - PullRequest
0 голосов
/ 24 мая 2019

Работа над созданием системы отслеживания времени / производства с Tkinter. Основная функция заключается в сканировании метки RFID. В зависимости от пользователя - будут запущены разные кадры. Сканирование RFID выполняется в отдельном внутреннем потоке. Я могу заставить содержимое RFID-метки отображаться на моем стартовом экране, но не смог понять, как запустить другие экраны, как показано на моей кнопке «Сканирование RFID должно открыть следующий кадр». Чтобы уточнить - как бы я запустил класс PageOne из класса Backend (Thread) Примечание: я разместил этот вопрос на StackExchange RPi - но мне сказали, что ваше сообщение, по-видимому, связано с общим программированием на python / tkinter, которое не специфично для RPi - jsotola 2 часа назад. Надеюсь, это правильный форум.

#!/usr/bin/env python
from threading import Thread
import time 
from time import sleep
from time import strftime
import datetime
from datetime import datetime
import tkinter as tk
from tkinter import ttk
from queue import Queue
import RPi.GPIO as GPIO
import sys
sys.path.append('/home/pi/MFRC522-python')
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()

LARGE_FONT= ("Verdana", 28)
CLOCK_FONT= ("Verdana", 96)
the_time=''
TIME = newtime = time.time()

class TimeClock(tk.Tk):    
    def __init__(self, *args, **kwargs):   
        tk.Tk.__init__(self, *args, **kwargs)
        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, PageTwo):           
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

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

    def go(self):
        p = Backend(self.queue)
        p.start()
        self.after(100, self.check_queue)        

class  StartPage(tk.Frame):  
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.configure(background="darkblue")

        label = tk.Label(self, text="XCompany", font=LARGE_FONT, bg="darkblue", fg="yellow")
        label.pack(pady=10,padx=10)

        lblSwipe = tk.Label(self, text="Swipe Card", font=LARGE_FONT, bg="darkblue", fg="yellow")
        lblSwipe.pack(pady=10, padx=10) 

        btnOtherFrame = tk.Button(self, text="RFID Scan Should Open Next Frame", command=lambda: controller.show_frame(PageTwo))
        btnOtherFrame.pack()

        self.status = tk.StringVar(self, value= "") #'.')
        tk.Label(self, textvariable=self.status,font=LARGE_FONT, fg="yellow", bg="Darkblue").place(x=600, y = 350 ,anchor = "s")         #, anchor= "n")#                                          pack(side="top")

        self.queue = Queue()

        self.go()

    def go(self):
        p = Backend(self.queue)
        p.start()
        self.after(100, self.check_queue)

    def check_queue(self):
        if not self.queue.empty():
            self.status.set(self.queue.get())
        if self.status.get() != 'done':
            self.after(100, self.check_queue)         

class  PageOne(tk.Frame):   
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Page One", font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        button1 = tk.Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage))      
        button1.pack()

        button2 = tk.Button(self, text="Visit Page 2", command=lambda: controller.show_frame(PageTwo))
        button2.pack()

class  PageTwo(tk.Frame):  
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Page Two", font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        button1 = tk.Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage))       
        button1.pack()

        button2 = tk.Button(self, text="Vist Page 1", command=lambda: controller.show_frame(PageOne))
        button2.pack()        

class Backend(Thread):
    def __init__(self, queue, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.queue = queue

    def run(self):
        self.queue.put('')
        #for n in range(1, 100):  Just have a loop to keep checking for input
        i = 1;
        while i == 1:
            print("Hold a tag near the reader")   
            try:
                id, text = reader.read()
                print(id)
                print(text)

                strName = "Accepted: " + text[5:]
                #self.queue.put(text)
                self.queue.put(strName)

                sleep(1)              
                strEmpNo = text[:4]
                print(strEmpNo)

                strEmpName =text[5:]
                strEmpName = strEmpName.strip()
                print(strEmpName)

                rawTime = time.time()
                print (rawTime)
                strRawTime = str(rawTime)

                current_time = strftime("%H:%M:%S")
                print (current_time)

                date_time = strftime("%m/%d/%Y")
                print(date_time)

                currentDT = strftime("%m/%d/%Y %H:%M:%S")
                strDate = str(currentDT)
                print (str(currentDT))

                #Save Data to MySQL DB

                sleep(2) # pause needed so we do not get multiple entry's
                self.queue.put('')

            #except:
            except Exception as e: print(e)
                #print("exception")

        self.queue.put('done')
        GPIO.cleanup()  

app = TimeClock()
app.geometry("800x480")
...