调用的 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 中的模块不应该 运行 多次,它们应该是一种定义要在其他脚本中使用的变量的方法。因此,两次导入模块不会 运行 它两次;解释器在第一次 运行 时存储模块中的变量,如果您尝试再次导入它,它将为您提供它已经存储的变量,而不是再次 运行 文件。

有几种方法可以解决这个问题;这是其中两个:

  1. 将模块中的代码放入函数中,并导入该函数:

    # 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
    
  2. 或者,如果由于某种原因无法做到这一点,请使用 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)