Можно ли оставить окно tkinter открытым, пока за ним работает код? - PullRequest
0 голосов
/ 12 октября 2018

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

from tkinter import *
import os

def check():
    for root, dirs, files in os.walk ("C:\\Users\\"):
        for file in files:
            if file.endswith("Details.txt"):
                fileLocation=(os.path.join(root, file))
                print(fileLocation)
                loading.destroy()

            else:
                createFile=open("Details.txt", "w")
                createFile.close()
                loading.destroy()
loading = Tk()
text = Label(loading, text="Loading...")
text.pack()
loading.mainloop()
check()

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вот как это можно сделать, запустив функцию поиска файлов в отдельном потоке, как я предложил в комментарии.Он использует Threading.Event для связи между основным потоком, который выполняет графический интерфейс tkiner, и потоком, выполняющим поиск.Я также исправил функцию поиска, чтобы он правильно создавал файл, когда он не был найден в конце.

import os
import sys
import tkinter as tk
from threading import Event, Thread

EVENT_TIMEOUT = .01  # A very short timeout - seconds.
POLLING_DELAY = 1000  # How often to check search status - millisecs.


def file_search(event):
    search_folder = r"C:\Users"
    target = "Details.txt"
    found = False

    for root, dirs, files in os.walk(search_folder):
        for filename in files:
            if filename.endswith(target):  # "if filename == target" would work fine here.
                fileLocation = os.path.join(root, filename)
                print(fileLocation, "file found")
                found = True
                break
        if found:
            break  # Quit looking.

    if not found:
        createFile = open(target, "w")  # Creates empty file in cwd.
        createFile.close()
        fileLocation = os.path.join(os.getcwd(), target)
        print(fileLocation, "file created")

    event.set()  # Signal search has completed.


def check_status(parent, event):
    event_is_set = event.wait(EVENT_TIMEOUT)
    if event_is_set:  # Done searching?
        parent.destroy()
        sys.exit()
    else:  # Continue polling.
        parent.after(POLLING_DELAY, check_status, parent, event)


parent = tk.Tk()
text = tk.Label(parent, text="Loading...")
text.pack()
event = Event()
thread = Thread(target=file_search, args=(event,))
check_status(parent, event)  # Starts the polling of search status.
thread.start()
parent.mainloop()
0 голосов
/ 12 октября 2018

Просто убедитесь, что код запускается после загрузки окна.Один из вариантов (полагаю, мы не ищем здесь многопоточность / обработку):

from tkinter import *
import os

class Loader:
    def __init__(self):
        self.root = Tk()
        self.text = Label(self.root, text="Loading...")
        self.text.pack()

        self.root.after(1000,self.check)
        self.root.mainloop()
    def check(self):
        for i in range(100000):
            print(i)
        self.text.destroy()
Loader()

Я также упаковал ваше приложение в классе.Вы также можете создать окно внутри функции, что может иметь больше смысла, но затем не забудьте self.root.update_idletasks()

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