调用的 python 文件不会再次显示
The called python file won't show again
我在调用文件 online.py
时遇到问题。
代码:
# For Face_recognition
from logging import disable
import tkinter
from tkinter.font import BOLD
from cv2 import data
import numpy as np
import face_recognition as fr
import cv2
# SQL-CONNECTOR
import mysql.connector
from mysql.connector import IntegrityError
# For Trainer
import PIL.Image
import os
from tkinter import ttk
# GUI
from tkinter import *
import tkinter as tk
from tkinter import messagebox
# USER INTERFACE
window = tk.Tk()
window.title("FACEREGISTRATION SYSTEM")
window.resizable(0,0)
# bgs = PhotoImage(file = "C://Users//So_Low//Desktop//final_recog//online_reg_img/edited2.png")
# labels1 = Label(window, image = bgs)
# labels1.place(x = 0, y = 0, relwidth= 1, relheight= 1)
# UPPER DESIGN
l1 = tk.Label(window, text= "N O R M I", font=("Exton Free Trial",35), fg='green')
l1.grid(column = 2, row= 1)
# TEXT BOXES
l1 = tk.Label(window, text= "Name", font=("Bahnschrift",15))
l1.grid(column = 1, row=3)
on1 = tk.Entry(window, width=40, bd=3)
on1.grid(column=2, row=3)
l1 = tk.Label(window, text= "Parent/Visitor", font=("Bahnschrift",15))
l1.grid(column = 1, row=5)
on2 = tk.Entry(window, width=40, bd=3)
on2.grid(column= 2, row=5)
l1 = tk.Label(window, text= "Relationship", font=("Bahnschrift",15))
l1.grid(column = 1, row=6)
on3 = tk.Entry(window, width=40, bd=3)
on3.grid(column= 2, row=6)
l1 = tk.Label(window, text= "ID", font=("Bahnschrift",15))
l1.grid(column = 1, row=7)
on4 = tk.Entry(window, width=19, bd=3, bg="light blue")
on4.grid(column=2, row=7)
l1 = tk.Label(window, text= "Address", font=("Bahnschrift",15))
l1.grid(column = 1, row=8)
on5 = tk.Entry(window, width=40, bd=3)
on5.grid(column= 2, row=8)
l1 = tk.Label(window, text= "Contact #", font=("Bahnschrift",15))
l1.grid(column = 1, row=9)
on6 = tk.Entry(window, width=20, bd=3, bg = "light blue")
on6.grid(column= 2, row=9)
def onregister():
if (on1.get()=="" or on2.get()=="" or on3.get()=="" or on4.get()=="" or on5.get()=="" or on6.get()==""):
messagebox.showinfo("Result","Please Complete the Provided Details!")
else:
databases = mysql.connector.connect(
host ="localhost",
user = "userdata",
password = "",
database = "facerecog"
)
cursors = databases.cursor()
cursors.execute("SELECT * from record")
result = cursors.fetchall()
id= on4.get()
id = int(id)+1
id
sql = "INSERT INTO record(ids, names,course_year,positions,addresses,contact) values(%s ,%s ,%s , %s, %s, %s)"
val = (id, on1.get(), on2.get(), on3.get(), on5.get(), on6.get())
try:
cursors.execute(sql,val)
databases.commit()
except IntegrityError:
messagebox.showinfo("Error","ID Is Already Exist")
return onregister
finally:
cursors.close()
databases.close()
on2.delete(0,END)
on3.delete(0,END)
on4.delete(0,END)
on5.delete(0,END)
on6.delete(0,END)
DirPath = "C:/Users/So_Low/Desktop/final_recog/online_reg_img/"
Files = os.listdir(DirPath)
for File in Files:
imgPath = os.path.join(DirPath, File)
image = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE)
cv2.imwrite("C:/Users/So_Low/Desktop/final_recog/img/"+str (on1.get())+"." +str(id)+".jpg",image)
btns1 = tk.Button(window,text= "Save To Database", font=("Bahnschrift",15),bg="light blue",fg="black",command=onregister)
btns1.grid(column=2,row=40)
l1 = tk.Label(window, text= " ", font=("Bahnschrift",15))
l1.grid(column = 2, row=35)
window.geometry("500x400")
window.mainloop()
我正在通过调用此函数在我的其他代码中导入它:
def onreg():
import online
online
return online
btn1 = tk.Button(window,text= "Online Register", font=("Bahnschrift",15),bg="light blue",fg="black",command=onreg)
btn1.grid(column=1,row=35)
当我点击按钮时显示,但是当我关闭调用的文件并再次点击它时它不会打开。而且没有错误显示。再次调用时如何显示?
Python 中的模块不应该 运行 多次,它们应该是一种定义要在其他脚本中使用的变量的方法。因此,两次导入模块不会 运行 它两次;解释器在第一次 运行 时存储模块中的变量,如果您尝试再次导入它,它将为您提供它已经存储的变量,而不是再次 运行 文件。
有几种方法可以解决这个问题;这是其中两个:
将模块中的代码放入函数中,并导入该函数:
# online.py (module):
def online():
... # code to be run
# Registers.py (main script):
import online # at start of file
... # some code
... # get rid of the onreg() function, it is not necessary
btn1 = tk.Button(..., command=online.online) # Line where button is created
... # rest of code
或者,如果由于某种原因无法做到这一点,请使用 importlib
库来 reload()
将再次 运行 的模块:
# online.py (module) stays the same
# Registers.py (main script):
import importlib # at start of file
online_module = None # at start of file, just after imports, call this variable whatever you want
... # some code
def onreg(): # redo this function
global online_module
try:
importlib.reload(online_module)
except TypeError:
import online_module
... # rest of code stays the same
程序只会导入一次,因此如果您尝试再次导入,代码将不会再次 运行。相反,将您想要的所有代码多次 运行 放入函数中,而不是模块中。
这是一个非常简单的解决方案,但不是很好。
# For Face_recognition
from logging import disable
import tkinter
from tkinter.font import BOLD
from cv2 import data
import numpy as np
import face_recognition as fr
import cv2
# SQL-CONNECTOR
import mysql.connector
from mysql.connector import IntegrityError
# For Trainer
import PIL.Image
import os
from tkinter import ttk
# GUI
from tkinter import *
import tkinter as tk
from tkinter import messagebox
def create_window():
# USER INTERFACE
window = tk.Tk()
window.title("FACEREGISTRATION SYSTEM")
window.resizable(0,0)
# bgs = PhotoImage(file = "C://Users//So_Low//Desktop//final_recog//online_reg_img/edited2.png")
# labels1 = Label(window, image = bgs)
# labels1.place(x = 0, y = 0, relwidth= 1, relheight= 1)
# UPPER DESIGN
l1 = tk.Label(window, text= "N O R M I", font=("Exton Free Trial",35), fg='green')
l1.grid(column = 2, row= 1)
# TEXT BOXES
l1 = tk.Label(window, text= "Name", font=("Bahnschrift",15))
l1.grid(column = 1, row=3)
on1 = tk.Entry(window, width=40, bd=3)
on1.grid(column=2, row=3)
l1 = tk.Label(window, text= "Parent/Visitor", font=("Bahnschrift",15))
l1.grid(column = 1, row=5)
on2 = tk.Entry(window, width=40, bd=3)
on2.grid(column= 2, row=5)
l1 = tk.Label(window, text= "Relationship", font=("Bahnschrift",15))
l1.grid(column = 1, row=6)
on3 = tk.Entry(window, width=40, bd=3)
on3.grid(column= 2, row=6)
l1 = tk.Label(window, text= "ID", font=("Bahnschrift",15))
l1.grid(column = 1, row=7)
on4 = tk.Entry(window, width=19, bd=3, bg="light blue")
on4.grid(column=2, row=7)
l1 = tk.Label(window, text= "Address", font=("Bahnschrift",15))
l1.grid(column = 1, row=8)
on5 = tk.Entry(window, width=40, bd=3)
on5.grid(column= 2, row=8)
l1 = tk.Label(window, text= "Contact #", font=("Bahnschrift",15))
l1.grid(column = 1, row=9)
on6 = tk.Entry(window, width=20, bd=3, bg = "light blue")
on6.grid(column= 2, row=9)
def onregister():
if (on1.get()=="" or on2.get()=="" or on3.get()=="" or on4.get()=="" or on5.get()=="" or on6.get()==""):
messagebox.showinfo("Result","Please Complete the Provided Details!")
else:
databases = mysql.connector.connect(
host ="localhost",
user = "userdata",
password = "",
database = "facerecog"
)
cursors = databases.cursor()
cursors.execute("SELECT * from record")
result = cursors.fetchall()
id= on4.get()
id = int(id)+1
id
sql = "INSERT INTO record(ids, names,course_year,positions,addresses,contact) values(%s ,%s ,%s , %s, %s, %s)"
val = (id, on1.get(), on2.get(), on3.get(), on5.get(), on6.get())
try:
cursors.execute(sql,val)
databases.commit()
except IntegrityError:
messagebox.showinfo("Error","ID Is Already Exist")
return onregister
finally:
cursors.close()
databases.close()
on2.delete(0,END)
on3.delete(0,END)
on4.delete(0,END)
on5.delete(0,END)
on6.delete(0,END)
DirPath = "C:/Users/So_Low/Desktop/final_recog/online_reg_img/"
Files = os.listdir(DirPath)
for File in Files:
imgPath = os.path.join(DirPath, File)
image = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE)
cv2.imwrite("C:/Users/So_Low/Desktop/final_recog/img/"+str (on1.get())+"." +str(id)+".jpg",image)
btns1 = tk.Button(window,text= "Save To Database", font=("Bahnschrift",15),bg="light blue",fg="black",command=onregister)
btns1.grid(column=2,row=40)
l1 = tk.Label(window, text= " ", font=("Bahnschrift",15))
l1.grid(column = 2, row=35)
window.geometry("500x400")
window.mainloop()
在你的其他代码中:
# This won't run anything anymore. It'll just define the function `create_window`.
import online
# We also don't need the function `onreg`. We can use `online.create_window` directly instead.
button1 = tk.Button(window, text="Online Register", font=("Bahnschrift",15), bg="light blue", fg="black", command=online.create_window)
button1.grid(column=1, row=35)
我在调用文件 online.py
时遇到问题。
代码:
# For Face_recognition
from logging import disable
import tkinter
from tkinter.font import BOLD
from cv2 import data
import numpy as np
import face_recognition as fr
import cv2
# SQL-CONNECTOR
import mysql.connector
from mysql.connector import IntegrityError
# For Trainer
import PIL.Image
import os
from tkinter import ttk
# GUI
from tkinter import *
import tkinter as tk
from tkinter import messagebox
# USER INTERFACE
window = tk.Tk()
window.title("FACEREGISTRATION SYSTEM")
window.resizable(0,0)
# bgs = PhotoImage(file = "C://Users//So_Low//Desktop//final_recog//online_reg_img/edited2.png")
# labels1 = Label(window, image = bgs)
# labels1.place(x = 0, y = 0, relwidth= 1, relheight= 1)
# UPPER DESIGN
l1 = tk.Label(window, text= "N O R M I", font=("Exton Free Trial",35), fg='green')
l1.grid(column = 2, row= 1)
# TEXT BOXES
l1 = tk.Label(window, text= "Name", font=("Bahnschrift",15))
l1.grid(column = 1, row=3)
on1 = tk.Entry(window, width=40, bd=3)
on1.grid(column=2, row=3)
l1 = tk.Label(window, text= "Parent/Visitor", font=("Bahnschrift",15))
l1.grid(column = 1, row=5)
on2 = tk.Entry(window, width=40, bd=3)
on2.grid(column= 2, row=5)
l1 = tk.Label(window, text= "Relationship", font=("Bahnschrift",15))
l1.grid(column = 1, row=6)
on3 = tk.Entry(window, width=40, bd=3)
on3.grid(column= 2, row=6)
l1 = tk.Label(window, text= "ID", font=("Bahnschrift",15))
l1.grid(column = 1, row=7)
on4 = tk.Entry(window, width=19, bd=3, bg="light blue")
on4.grid(column=2, row=7)
l1 = tk.Label(window, text= "Address", font=("Bahnschrift",15))
l1.grid(column = 1, row=8)
on5 = tk.Entry(window, width=40, bd=3)
on5.grid(column= 2, row=8)
l1 = tk.Label(window, text= "Contact #", font=("Bahnschrift",15))
l1.grid(column = 1, row=9)
on6 = tk.Entry(window, width=20, bd=3, bg = "light blue")
on6.grid(column= 2, row=9)
def onregister():
if (on1.get()=="" or on2.get()=="" or on3.get()=="" or on4.get()=="" or on5.get()=="" or on6.get()==""):
messagebox.showinfo("Result","Please Complete the Provided Details!")
else:
databases = mysql.connector.connect(
host ="localhost",
user = "userdata",
password = "",
database = "facerecog"
)
cursors = databases.cursor()
cursors.execute("SELECT * from record")
result = cursors.fetchall()
id= on4.get()
id = int(id)+1
id
sql = "INSERT INTO record(ids, names,course_year,positions,addresses,contact) values(%s ,%s ,%s , %s, %s, %s)"
val = (id, on1.get(), on2.get(), on3.get(), on5.get(), on6.get())
try:
cursors.execute(sql,val)
databases.commit()
except IntegrityError:
messagebox.showinfo("Error","ID Is Already Exist")
return onregister
finally:
cursors.close()
databases.close()
on2.delete(0,END)
on3.delete(0,END)
on4.delete(0,END)
on5.delete(0,END)
on6.delete(0,END)
DirPath = "C:/Users/So_Low/Desktop/final_recog/online_reg_img/"
Files = os.listdir(DirPath)
for File in Files:
imgPath = os.path.join(DirPath, File)
image = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE)
cv2.imwrite("C:/Users/So_Low/Desktop/final_recog/img/"+str (on1.get())+"." +str(id)+".jpg",image)
btns1 = tk.Button(window,text= "Save To Database", font=("Bahnschrift",15),bg="light blue",fg="black",command=onregister)
btns1.grid(column=2,row=40)
l1 = tk.Label(window, text= " ", font=("Bahnschrift",15))
l1.grid(column = 2, row=35)
window.geometry("500x400")
window.mainloop()
我正在通过调用此函数在我的其他代码中导入它:
def onreg():
import online
online
return online
btn1 = tk.Button(window,text= "Online Register", font=("Bahnschrift",15),bg="light blue",fg="black",command=onreg)
btn1.grid(column=1,row=35)
当我点击按钮时显示,但是当我关闭调用的文件并再次点击它时它不会打开。而且没有错误显示。再次调用时如何显示?
Python 中的模块不应该 运行 多次,它们应该是一种定义要在其他脚本中使用的变量的方法。因此,两次导入模块不会 运行 它两次;解释器在第一次 运行 时存储模块中的变量,如果您尝试再次导入它,它将为您提供它已经存储的变量,而不是再次 运行 文件。
有几种方法可以解决这个问题;这是其中两个:
将模块中的代码放入函数中,并导入该函数:
# online.py (module): def online(): ... # code to be run # Registers.py (main script): import online # at start of file ... # some code ... # get rid of the onreg() function, it is not necessary btn1 = tk.Button(..., command=online.online) # Line where button is created ... # rest of code
或者,如果由于某种原因无法做到这一点,请使用
importlib
库来reload()
将再次 运行 的模块:# online.py (module) stays the same # Registers.py (main script): import importlib # at start of file online_module = None # at start of file, just after imports, call this variable whatever you want ... # some code def onreg(): # redo this function global online_module try: importlib.reload(online_module) except TypeError: import online_module ... # rest of code stays the same
程序只会导入一次,因此如果您尝试再次导入,代码将不会再次 运行。相反,将您想要的所有代码多次 运行 放入函数中,而不是模块中。
这是一个非常简单的解决方案,但不是很好。
# For Face_recognition
from logging import disable
import tkinter
from tkinter.font import BOLD
from cv2 import data
import numpy as np
import face_recognition as fr
import cv2
# SQL-CONNECTOR
import mysql.connector
from mysql.connector import IntegrityError
# For Trainer
import PIL.Image
import os
from tkinter import ttk
# GUI
from tkinter import *
import tkinter as tk
from tkinter import messagebox
def create_window():
# USER INTERFACE
window = tk.Tk()
window.title("FACEREGISTRATION SYSTEM")
window.resizable(0,0)
# bgs = PhotoImage(file = "C://Users//So_Low//Desktop//final_recog//online_reg_img/edited2.png")
# labels1 = Label(window, image = bgs)
# labels1.place(x = 0, y = 0, relwidth= 1, relheight= 1)
# UPPER DESIGN
l1 = tk.Label(window, text= "N O R M I", font=("Exton Free Trial",35), fg='green')
l1.grid(column = 2, row= 1)
# TEXT BOXES
l1 = tk.Label(window, text= "Name", font=("Bahnschrift",15))
l1.grid(column = 1, row=3)
on1 = tk.Entry(window, width=40, bd=3)
on1.grid(column=2, row=3)
l1 = tk.Label(window, text= "Parent/Visitor", font=("Bahnschrift",15))
l1.grid(column = 1, row=5)
on2 = tk.Entry(window, width=40, bd=3)
on2.grid(column= 2, row=5)
l1 = tk.Label(window, text= "Relationship", font=("Bahnschrift",15))
l1.grid(column = 1, row=6)
on3 = tk.Entry(window, width=40, bd=3)
on3.grid(column= 2, row=6)
l1 = tk.Label(window, text= "ID", font=("Bahnschrift",15))
l1.grid(column = 1, row=7)
on4 = tk.Entry(window, width=19, bd=3, bg="light blue")
on4.grid(column=2, row=7)
l1 = tk.Label(window, text= "Address", font=("Bahnschrift",15))
l1.grid(column = 1, row=8)
on5 = tk.Entry(window, width=40, bd=3)
on5.grid(column= 2, row=8)
l1 = tk.Label(window, text= "Contact #", font=("Bahnschrift",15))
l1.grid(column = 1, row=9)
on6 = tk.Entry(window, width=20, bd=3, bg = "light blue")
on6.grid(column= 2, row=9)
def onregister():
if (on1.get()=="" or on2.get()=="" or on3.get()=="" or on4.get()=="" or on5.get()=="" or on6.get()==""):
messagebox.showinfo("Result","Please Complete the Provided Details!")
else:
databases = mysql.connector.connect(
host ="localhost",
user = "userdata",
password = "",
database = "facerecog"
)
cursors = databases.cursor()
cursors.execute("SELECT * from record")
result = cursors.fetchall()
id= on4.get()
id = int(id)+1
id
sql = "INSERT INTO record(ids, names,course_year,positions,addresses,contact) values(%s ,%s ,%s , %s, %s, %s)"
val = (id, on1.get(), on2.get(), on3.get(), on5.get(), on6.get())
try:
cursors.execute(sql,val)
databases.commit()
except IntegrityError:
messagebox.showinfo("Error","ID Is Already Exist")
return onregister
finally:
cursors.close()
databases.close()
on2.delete(0,END)
on3.delete(0,END)
on4.delete(0,END)
on5.delete(0,END)
on6.delete(0,END)
DirPath = "C:/Users/So_Low/Desktop/final_recog/online_reg_img/"
Files = os.listdir(DirPath)
for File in Files:
imgPath = os.path.join(DirPath, File)
image = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE)
cv2.imwrite("C:/Users/So_Low/Desktop/final_recog/img/"+str (on1.get())+"." +str(id)+".jpg",image)
btns1 = tk.Button(window,text= "Save To Database", font=("Bahnschrift",15),bg="light blue",fg="black",command=onregister)
btns1.grid(column=2,row=40)
l1 = tk.Label(window, text= " ", font=("Bahnschrift",15))
l1.grid(column = 2, row=35)
window.geometry("500x400")
window.mainloop()
在你的其他代码中:
# This won't run anything anymore. It'll just define the function `create_window`.
import online
# We also don't need the function `onreg`. We can use `online.create_window` directly instead.
button1 = tk.Button(window, text="Online Register", font=("Bahnschrift",15), bg="light blue", fg="black", command=online.create_window)
button1.grid(column=1, row=35)