Работа над созданием системы отслеживания времени / производства с 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")