Python Pyinstaller exe打开tkinter窗口的多个实例,Python Firebase [视频]

时间:2018-02-08 09:48:36

标签: python windows tkinter exe pyinstaller

我有一个报废脚本,其中我使用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()

演示Video here

2 个答案:

答案 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