为什么会弹出一个意外的额外Tk()窗口,而不是在空闲状态?为什么Pyinstaller会破坏功能?

2024-05-23 23:06:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python3.7中的Tkinter创建一个类似于“paint”的应用程序,只是为了进行实验。我做了一个“打开文件”和一个“保存文件”功能。一切工作正常如预期,我可以创建新的文件,我可以打开文件,我可以保存文件。我认为问题在于save函数。你知道吗

我不能在空闲时重现这个问题,它工作得很好。 如果我双击打开命令行的.py文件(windows10),我可以半再现这个问题。-在这里它可以正常工作,但是出现了一个意外的Tk(),我必须在保存之前关闭它

关键问题是当我用pyinstaller生成一个可执行文件时。出现意外的extra Tk()窗口,整个应用程序冻结。你知道吗

我有一个猜测,这个问题与“tkinter文件对话框”有关。 额外窗口出现在filedialog函数之前或之后。 我还发现,同样的事情发生在我身上,正如这里所描述的: PyInstaller WARNING: lib not found 但我找不到解决办法,另一方面,我不认为这在问题中有重要作用。你知道吗

from tkinter import *
from tkinter import filedialog
from functools import partial
import pyscreenshot as ImageGrab
from PIL import Image, ImageTk

#Sorry for the Hungarian variable names
#mentés = save
#ablak = window
#just mentioning it.
#I am not showing all the code

def mentes3(): #taking screenshot with PIL
    global ablak1, extension
    x2=ablak1.winfo_rootx()+can1.winfo_x()
    y2=ablak1.winfo_rooty()+can1.winfo_y()
    x1=x2+can1.winfo_width()
    y1=y2+can1.winfo_height()
    print("save")
    kep = ImageGrab.grab().crop((x2,y2,x1,y1))
    directory=filedialog.askdirectory()
    kep.save(directory+"\\"+name+extension)
    print(directory+"\\"+name+extension)


def mentes2(ablak2, entry1, var):
    global ablak1, name, extension
    name = entry1.get()
    extension = var.get()
    ablak2.destroy()
    ablak1.after(300,mentés3)



def mentes():
    global name
    ablak2=Toplevel()
    ablak2.title("Mentés")
    label1 = Label(ablak2, text="Dokumentum neve:").grid(row=1, column=1)
    entry1 = Entry(ablak2)
    entry1.grid(row=1, column=2)
    var = StringVar(ablak2)
    var.set(".JPG")
    option = OptionMenu(ablak2, var, ".JPG", ".PNG", ".BMP", ".GIF", ".PCX")
    option.grid(row=2, column=1)
    action_with_arg = partial(mentés2, ablak2, entry1, var)
    gomb1 = Button(ablak2, text="Mentés", command=action_with_arg)
    gomb1.grid(column=2)

    ablak2.mainloop()






ablak1 = Tk()

can1 = Canvas(width = 500, height = 500, bg = "white", cursor=cursor)
can1.grid(column=2,row=1)
can1.old_coords = None 

fajlmenu = Menu(ablak1)
fajlmenu_uj = Menu(fájlmenü, tearoff=False)
#fajlmenu_uj.add_command(label="New document", command = újdoksi)
fajlmenu_uj.add_command(label="Save", command =mentés)
#fajlmenu_uj.add_command(label="Open", command =megnyitás)

fájlmenü.add_cascade(label="Fájl", menu=fajlmenü_uj)
ablak1.config(menu=fajlmenu)


ablak1.title("Python paint")
ablak1.mainloop()

#I hope this much code is enough for reproducing the problem and
#I didn't copy too few of the code.

输入: -单击文件/保存

预期产量: -顶级小工具出现,我按下一个按钮 -目录选择对话框出现,我选择目录 -文件已保存

怠速输出: -预期产量

从命令行输出: -顶层小工具出现,我按下一个按钮; -Tk()的另一个实例出现了-我关闭它 -目录选择对话框出现,我选择目录 -文件已保存

pyinstaller可执行文件的输出: -顶级小工具出现,我按下一个按钮 -Tk()的另一个实例出现了-我关闭它 -整个东西都冻僵了,我必须杀了它。你知道吗

为什么会有这种差异,如何处理?你知道吗


Tags: 文件nameimportvarextensioncolumncommandtk