Python 如何修复Tkinter帧控制器密钥错误?
我是python新手,我正在尝试使用RFID创建登录。 我开始使用许多顶级窗口创建一个简单的GUI,但我只想在一个窗口中创建一个GUI,而控制器解决了这个问题。现在我遇到了一个问题,因为我试图获取变量“id”的值,并将其用作从数据库获取数据的引用 这是我的密码Python 如何修复Tkinter帧控制器密钥错误?,python,tkinter,Python,Tkinter,我是python新手,我正在尝试使用RFID创建登录。 我开始使用许多顶级窗口创建一个简单的GUI,但我只想在一个窗口中创建一个GUI,而控制器解决了这个问题。现在我遇到了一个问题,因为我试图获取变量“id”的值,并将其用作从数据库获取数据的引用 这是我的密码 class Kiosk(Tk): def __init__(self, *args, **kwargs): Tk.__init__(self, *args, **kwargs) self.titl
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()
我想我扫描我的RFID没有任何问题。我只需要获得从id到主页的扫描RFID的值,将其用作获取所需数据的参考
我遵循布莱恩·奥克利爵士所回答的解决方案,以及他对其他问题的其他回答。我读了一整夜,不知怎的,我明白了他对他的回答的意思,我只是不知道为什么我不能这么做
我希望你们能帮助我。我修剪了上面的代码,并提供了唯一与错误相关的代码。
谢谢大家! 首先:您必须使用
self.id
而不是id
才能从不同的地方访问id
def login_RFID(self, event):
self.reader = SimpleMFRC522()
self.id, self.text = self.reader.read() # self.id
第二:您必须在主页
中运行此函数才能获得正确的值
login_rfid_page = self.controller.get_page("Login_RFID")
login_rfid_page.login_RFID(None) # run scanner
value = login_rfid_page.id
print(value)
错误显示它在窗口中更改框架时出现问题-在
self.frames
中找不到main\u页面
-它似乎没有创建此框架或已被删除。如何运行它?从show frame调用中删除引号。它应该是self.controller.show\u frame(主页面)
。对于show_帧调用的所有其余部分也是如此。不要使用引号;使用实际对象。您必须创建Kiosk
的一个实例来创建所有帧。您好,先生@furas,如果我删除了'value=login\u rfid\u page.id',但我无法将id的值获取到main\u page类,那么我运行它时不会出错。当我添加'value=login\u rfid\u page.id'时,我得到了问题中所述的错误。谢谢您的回复,先生@小说:那是不对的show_frame()
需要一个字符串参数(一个frame
子类的名称)。您好,先生,谢谢您提供这个简化的答案。但是它不工作,如果我添加了login\u rfid\u页面,我的GUI就不会弹出。login\u rfid(None)
我删除了它,它工作正常,但id的值为None。当我使用简单的MFRC522 RFID阅读器时,整个程序被冻结,直到我扫描RFID。我想这就是为什么…当我使用self.reader=SimpleMFRC522()
时,我的整个GUI都冻结了。我不知道为什么我用bind。如果我扫描RFID,它会再次响应。如果您必须运行长时间运行的代码,那么您可能必须在separted线程中运行它,但这是另一个大问题。长时间运行的代码块mainloop
从系统获取键/鼠标事件,将它们发送到小部件,重新绘制小部件-因此它看起来像是冻结的。每当我声明self.reader=SimpleMFRC522()
它也是启动MFRC522开始扫描的代码。我可以创建另一个方法将id值从login\u RFID
传递到“new\u method
?然后我将调用login\u rfid\u页面。新的\u方法(无)
可能吗?当我执行login\u rfid\u页面时,我返回到以前的错误。login\u rfid(无)
login_rfid_page = self.controller.get_page("Login_RFID")
login_rfid_page.login_RFID(None) # run scanner
value = login_rfid_page.id
print(value)