簡體   English   中英

如何修復 Tkinter 幀控制器密鑰錯誤?

[英]How to fix Tkinter frames controller key error?

我是 python 新手,我正在嘗試使用 RFID 創建登錄。 我開始使用大量 Toplevel 窗口創建一個簡單的 GUI,但我只想在一個窗口中創建一個 GUI,並且控制器可以解決它。 現在我遇到了一個問題,因為我試圖獲取變量“id”的值並將其用作從我的數據庫中獲取數據的參考。

這是我的代碼。

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

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        GPIO.setwarnings(False)

        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.style = Style()
        self.style.theme_use('alt')
        self.style.map('TCombobox', fieldbackground=[('readonly','white')])

        self.db = pymysql.connect(host = "192.168.1.11",port = 3306, user = "root",passwd = "justin",db= "thesis_db")
        self.cursor = self.db.cursor()
        self.QueryResident = "CREATE TABLE IF NOT EXISTS residents_db (FIRST_NAME varchar(255) not null, MIDDLE_NAME varchar(255) not null, LAST_NAME varchar(255) not null,SEX varchar(255) not null, BIRTH_DATE date, CIVIL_STATUS varchar(255) not null, PLACE_OF_BIRTH varchar(255) not null, RFID varchar(255) not null)"
        self.cursor.execute(self.QueryResident)

        self.frames = {}
        for F in (Start_Page, Registration_Page_Admin, Registration_Page_User, Update_User, Update_Admin, Login_RFID, main_page):
            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("Start_Page")

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

class Start_Page(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
        label = Label(self, text="Login", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)

        button1 = Button(self, text="Login",
                            command=lambda: controller.show_frame("Login_RFID"))
        button1.pack()

class Login_RFID(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.parent = parent
        self.controller = controller
        self.get_Firstn1 = None
        self.img_login = (Image.open("Scan_RFID.png"))
        self.image_login = self.img_login.resize((550,417))
        self.img_background_login = ImageTk.PhotoImage(self.image_login)

        self.db = pymysql.connect(host = "192.168.1.11",port = 3306, user = "root",passwd = "justin",db= "thesis_db")
        self.cursor = self.db.cursor()

        label_login = Label(self, image = self.img_background_login) 
        label_login.pack(fill="both", expand = 1)
        label_login.bind('<Enter>',self.login_RFID)


    def login_RFID(self, event):
        self.reader = SimpleMFRC522()
        self.id, self.text = self.reader.read()
        self.cursor.execute("SELECT * FROM residents_admin WHERE RFID = %s",str(self.id))
        if (self.cursor.fetchone() is not None): 
            self.controller.show_frame("main_page")
            qwe = False
        else:
            self.cursor.execute("SELECT * FROM residents_db WHERE RFID = %s", str(self.id))
            if (self.cursor.fetchone() is not None): 
                self.controller.show_frame("main_page")
                qwe = False
            else:
                messagebox.showerror("Warning!","Your RFID card is not yet registered!")

    def get_data(self):
        self.cursor.execute("SELECT * FROM residents_admin WHERE RFID = %s",str(self.id))
        if (self.cursor.fetchone() is not None): 
            self.cursor.execute("SELECT FIRST_NAME FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Firstn = self.cursor.fetchone()
            self.get_Firstn1 = str(self.get_Firstn[0])
            self.cursor.execute("SELECT MIDDLE_NAME FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Middlen = self.cursor.fetchone()
            self.get_Middlen1 = str(self.get_Middlen[0])
            self.cursor.execute("SELECT LAST_NAME FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Lastn = self.cursor.fetchone()
            self.get_Lastn1 = str(self.get_Lastn[0])
            self.cursor.execute("SELECT BIRTH_DATE FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Birthd = self.cursor.fetchone()
            self.get_Birthd1 = str(self.get_Birthd[0])
            self.cursor.execute("SELECT PLACE_OF_BIRTH FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Placeb = self.cursor.fetchone()
            self.get_Placeb1 = str(self.get_Placeb[0])
            self.cursor.execute("SELECT CIVIL_STATUS FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Civils = self.cursor.fetchone()
            self.get_Civils1 = str(self.get_Civils[0])
            self.cursor.execute("SELECT SEX FROM residents_admin WHERE RFID = %s", str(self.id))
            self.get_Sex = self.cursor.fetchone()
            self.get_Sex1 = str(self.get_Sex[0])

class main_page(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
        label = Label(self, text="Welcome", font=controller.title_font)
        label.pack()
        login_rfid_page = self.controller.get_page("Login_RFID")
        login_rfid_page.get_data(None)
        value = login_rfid_page.get_Firstn1
        print(value)

        button1 = Button(self, text="Register User",
                            command=lambda: self.controller.show_frame("Registration_Page_User"))
        button2 = Button(self, text="Register Admin",
                            command=lambda: self.controller.show_frame("Registration_Page_Admin"))
        button3 = Button(self, text="Update User",
                            command=lambda: self.controller.show_frame("Update_User"))
        button4 = Button(self, text="Update Admin",
                            command=lambda: self.controller.show_frame("Update_Admin"))
        button1.pack()
        button2.pack()
        button3.pack()
        button4.pack()

這是我的錯誤。

    Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/home/pi/Thesis/qweqweqweq.py", line 85, in login_RFID
    self.controller.show_frame("main_page")
  File "/home/pi/Thesis/qweqweqweq.py", line 45, in show_frame
    frame = self.frames[page_name]
KeyError: 'main_page'

我認為掃描我的 RFID 沒有任何問題。 我只需要從id到主頁面獲取掃描的RFID的值,以作為參考來獲取所需的數據。

我遵循了 Bryan Oakley 爵士在此處回答的解決方案以及他對其他問題的其他回答。 我讀了一整夜,我以某種方式明白了他對他的回答的意思,我只是不知道為什么我做不到。

我希望你們能幫助我。 我修剪了上面的代碼並提供了與錯誤相關的唯一代碼。 謝謝!

第一:你必須使用self.id而不是id才能從不同的地方訪問id

def login_RFID(self, event):

    self.reader = SimpleMFRC522()
    self.id, self.text = self.reader.read()  # self.id

第二:您必須在main_page運行此函數才能獲得正確的值

    login_rfid_page = self.controller.get_page("Login_RFID")

    login_rfid_page.login_RFID(None)  # run scanner

    value = login_rfid_page.id
    print(value)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM