Почему неожиданно появляется дополнительное окно Tk (), но не в режиме IDLE? Почему Pyinstaller разрушает функциональность? - PullRequest
0 голосов
/ 21 мая 2019

Я экспериментирую с созданием приложения типа "краска" с Tkinter в Python 3.7, просто для экспериментов. Я сделал функцию «открыть файл» и «сохранить файл». Все работает нормально, как и ожидалось, я могу создать новый документ, я могу открыть файл, я могу сохранить файл. Проблема заключается в функции сохранения, которую я считаю.

Я не могу воспроизвести проблему в режиме ожидания, она работает нормально. Я могу наполовину воспроизвести проблему, если дважды щелкнуть файл .py (windows 10), который открывает командную строку. - Здесь все работает нормально, но появляется неожиданный Tk (), и я должен закрыть его перед сохранением

Критическая проблема - когда я делаю исполняемый файл с помощью pyinstaller. Появляется неожиданное дополнительное окно Tk (), и все приложение зависает.

У меня есть предположение, что проблема связана с "tkinter filedialog". Дополнительное окно появляется либо до, либо после функции filedialog. Я также узнал, что со мной происходит то же самое, как описано здесь: PyInstaller ВНИМАНИЕ: lib не найдена Но я не мог найти решение, с другой стороны, я не думаю, что это играет важную роль в проблеме.

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 () - я его закрываю -Это всё заморожено, я должен убить его.

Почему разница и как с ней бороться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...