我有一个报废脚本,其中我使用tkinter为ui。当我构建exe(使用pyinstaller)并打开它时效果很好,但是当我关闭它时,它会打开tkinter Window的多个实例。我无法粘贴完整的代码。所以我粘贴了我正在使用的所有tkinter代码。
以下是完整代码Github Gist here
import requests
from lxml import html
from tkinter import *
import tkinter as ttk
import re
import datetime
import os
from firebase import firebase
import hashlib
#import App as App
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
#Region Tk
root = Tk()
root['height'] = 400
root['width'] = 600
global firebase
firebase = firebase.FirebaseApplication('#######URL####',None)
f1 = Frame(root)
f1["height"] = root["height"]
f1["width"] = root["width"]
root.title("JD Scrapper - Gear Up Studio ")
Label(f1,text = "Input Url : Example : https://www.justdial.com/Ahmedabad/Gyms ").grid(row=0,column = 0,)
def getBool(event):
print(boolvar.get())
#Check Button
global boolvar
boolvar = BooleanVar()
boolvar.set(False)
boolvar.trace('w', lambda *_: print("The value was changed"))
cb = Checkbutton(f1, text = "Tele Phone number", variable = boolvar)
cb.bind("<Button-1>", getBool)
cb.grid(row=1, column=1)
global key_filled
key_filled = Entry(f1,width=50)
key_filled.grid(row=2,column=0)
key_filled.focus_set()
global activate_button
activate_button = Button(f1 , text="Active Now")
activate_button.bind("<Button-1>",activate_key)
activate_button.grid(row=2, column=1)
result = Label(f1, width=50)
result.grid(row=1,column=2)
global submit_button
submit_button = Button(f1 , text="Scrap Now")
submit_button.bind("<Button-1>",button_clicked)
submit_button.grid(row=1, column=0)
submit_button.config(state=NORMAL)
key_validation()
f1.pack()
root.mainloop()
答案 0 :(得分:1)
我遇到了与Firebase和pyqt5完全相同的问题。经过多次尝试,我检查了Firebase库。在初始化中,有close_process_pool()函数,该函数在程序退出并关闭所有多处理池时调用。在tkinter和pyqt情况下,我们不需要此函数,因为所有过程都是主GUI线程的子进程,因此只需删除该函数即可解决问题。 将初始化文件更改为此将解决问题。
import atexit
#from .async import process_pool
from firebase import *
'''
@atexit.register
def close_process_pool():
"""
Clean up function that closes and terminates the process pool
defined in the ``async`` file.
"""
process_pool.close()
process_pool.join()
process_pool.terminate()
'''
答案 1 :(得分:0)
我可以在运行你的cmd
时看到exe
窗口弹出以删除使用此命令-w
,并将其作为onefile编译到dist文件夹中使用-F
来编译它作为单个文件,执行此操作以解决问题
pyinstaller -w -F replace this with your script name.py
它会将文件编译为一个文件,并且将使用res