我有一些tkinter GUI代码,在VS代码中本地启动时运行良好。但是,当我使用Pyinstaller创建.exe时,下面的代码工作正常,但成功登录后,下面的程序调用我的主程序类,无法加载。它只是创建了我的屏幕,用正确的几何图形和背景色,但不是没有我的小工具。
from config import *
import base64
from PIL import ImageTk,Image
from attribution_tool_main_program_class import main_program
import pandas as pd
import os
import sys
from sql_uploader import azure_sql_connector
from tkinter import Tk,Label,Canvas,Entry,Button, messagebox, Toplevel,mainloop
class login_screen_class():
def __init__(self):
self.df = azure_sql_connector('opr_dev').read_table('SELECT * FROM [dbo].[attribution_username_file]')
self.root = Tk()
self.root.withdraw()
self.login_screen = Toplevel(self.root)
self.login_screen.title("Attribution Tool - Login")
self.login_screen.geometry("1920x1080")
train_icon = self.resource_path('train.ico')
self.login_screen.iconbitmap(train_icon)
background_image=self.resource_path('background_image_2.png')
self.my_img = ImageTk.PhotoImage(Image.open(background_image))
my_label = Label(self.login_screen,image=self.my_img)
my_label.grid(row=0,column=0, sticky='N')
my_canvas1 = Canvas(self.login_screen,bg = "#75787B")
my_canvas1.grid(row=0,column=0,padx=200,pady=200)
font= "Helvetica, 16"
user_Name = Label(my_canvas1,text="Username",bg = "#75787B", fg="white",font=font)
user_Name.grid(row=0,column=0,columnspan=2,pady=10,padx=10,sticky='N')
self.username_entry = Entry(my_canvas1,width =30,bg = "#75787B",font=font,foreground='white')
self.username_entry.grid(row=1,column=0,padx=10)
password_name = Label(my_canvas1,text="Password",bg = "#75787B", fg="white",font=font,borderwidth=0)
password_name.grid(row=2,column=0,columnspan=2,pady=10,padx=10)
self.password_entry = Entry(my_canvas1,width =30,bg = "#75787B",font=font,foreground='white',show='*')
self.password_entry.grid(row=3,column=0,padx=10)
login_image=self.resource_path('login-button-png-7.png')
my_img_login = ImageTk.PhotoImage(Image.open(login_image))
sign_in_button = Button(my_canvas1,image=my_img_login, command = lambda: self.username_password_check(), borderwidth=0)
sign_in_button.grid(row=4,column=0,columnspan=2, pady=10, padx=10)
self.login_screen.bind_all("<Return>",self.username_password_check)
mainloop()
def resource_path(self,relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def username_password_check(self,event=None):
self.username = self.username_entry.get().lower()
password=self.password_entry.get()
if self.username =="":
messagebox.showerror("No username entered", "Please enter a valid username to login to Attribution Tool")
elif password =="":
messagebox.showerror("No password entered", "Please enter a valid password to login to Attribution Tool")
login_list = self.df.values.tolist()
for record in login_list:
if record[0].lower() ==self.username:
if base64.b64decode(record[1]).decode("utf-8") == password:
self.login_screen.withdraw()
main_program((self.username).capitalize(),self.root)
else:
messagebox.showerror("Login Error", "The details you have entered are invalid")
break
if __name__ == '__main__':
login_screen_class()
下面的命令是我用来将文件导出到.exe的命令
pyinstaller --name Attribution_tool --onefile --windowed --icon=Train.ico --add-data "login-button-png-7.png;." --add-data "background_image_2.png;." --add-data "train.ico;." Attribution_tool_v19.py