为了进行实验,我正在尝试在Python 3.7中使用Tkinter创建“绘画”类的应用程序。我做了一个“打开文件”和“保存文件”的功能。一切正常,可以创建新文档,可以打开文件,可以保存文件。我认为问题出在保存功能上。
我无法在IDLE中重现该问题,它可以正常工作。 如果我双击打开命令行的.py文件(Windows 10),则可以一半重现该问题。 -在这里工作正常,但是出现了意外的Tk(),我必须在保存之前将其关闭
关键问题是当我使用pyinstaller创建可执行文件时。出现意外的额外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.
输入: -点击文件/保存
预期输出: -顶级小部件出现,我按一个按钮 -出现目录选择对话框,我选择目录 -文件已保存
IDLE中的输出: -预期产量
从命令行输出: -出现顶级小部件,我按一个按钮; -出现Tk()的另一个实例-我将其关闭 -出现目录选择对话框,我选择目录 -文件已保存
pyinstaller可执行文件的输出: -顶级小部件出现,我按一个按钮 -出现Tk()的另一个实例-我将其关闭 -整个东西都冻结了,我必须杀死它。
为什么会有区别,以及如何处理?