Tkinter выдает следующую ошибку в python 3.6: TclError: NULL main Window - PullRequest
0 голосов
/ 27 ноября 2018

Я пишу программу на python, которая выполняет следующую последовательность:
1. Диалоговое окно для открытия / выбора каталога
2. Выполнение определенных операций
3. Переименование файла с помощью диалогового окна tkinter
4. Выполните остальные операции

Я написал следующий код:

def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    root.destroy()

def input_name():
    def callback():
        print(e.get())
        root.quit()
    e = ttk.Entry(root)
    NORM_FONT = ("Helvetica", 10)
    label = ttk.Label(root,text='Enter the name of the ROI', font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    e.pack(side = 'top',padx = 10, pady = 10)
    e.focus_set()
    b = ttk.Button(root, text = "OK", width = 10, command = callback)
    b.pack()

def close_window():
    root.destory()

root = tk.Tk()
root.withdraw()
open_directory()  #dialogue box to select directory
<perform certain operations>
input_name()  #dialgue box for user input file name
root.mainloop()
close_window() #exit the mainloop of tkinter
<perform rest of the functions>

, но я получаю следующую ошибку Tclerror: NULL main window Я думаю, что объявлено rootкак главное окно, но я, кажется, не могу найти, где я допустил ошибку.Есть ли какой-то другой способ, который лучше для того, что я пытаюсь сделать здесь?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Использование .destroy() и .quit(), как действительно сказал @CommonSense, на самом деле не кажется хорошо спланированным.

Мало того, вам нужно использовать триггеры или события для управления вызовами функций, иначе онипросто бегите по прямой, предотвращая запуск другой, как в вашем коде.

Вы также должны контролировать, когда close_window() вызывается с событием:

from tkinter import filedialog
import tkinter as tk
def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    #root.destroy()
    input_name()

def input_name():
    def callback():
        print(e.get())
        #root.quit()
    es_variable=tk.StringVar()
    e = tk.Entry(root, textvariable=es_variable)
    NORM_FONT = ("Helvetica", 10)
    label = tk.Label(root,text='Enter the name of the ROI', font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    e.pack(side = 'top',padx = 10, pady = 10)
    e.focus_set()
    b = tk.Button(root, text = "OK", width = 10, command = callback)
    b.pack()

def close_window():
    root.destory()

root = tk.Tk()
#root.withdraw()
open_dir_button = tk.Button(root, text = "Open Dialog", width = 10, command =open_directory)
open_dir_button.pack()
#dialogue box to select directory
#<perform certain operations>
#dialgue box for user input file name
root.mainloop()
#close_window() #exit the mainloop of tkinter
#<perform rest of the functions>
0 голосов
/ 27 ноября 2018

Как упомянул @CommonSense, когда вы используете команду «удалить», чтобы скрыть главное окно, вам нужно использовать метод deiconify, чтобы снова использовать рут.Следовательно, измените функцию change_directory следующим образом:

def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    root.deiconify()

Если вы не деиконизируете окно, вы не можете вызвать функцию input_name, которая использует корневое окно.

Я проверил этот код, и он работает.

PS: У вас также есть опечатка в функции close_window (при разрушении окна).

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