Как я мог бы перейти к реализации tkinter.filedialog.askdirectory() в это?

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь сделать так, чтобы в этом простом графическом интерфейсе вы могли изменить каталог для исходного файла и файла назначения. Из более раннего сообщения я увидел, что могу использовать tkinter.filedialop.askdirectory, но я не знаю, как я должен реализовать это в коде. Должен ли я сделать отдельную кнопку для исходного и целевого каталогов?

 import shutil
import os
import tkinter as tk

source_dir = '/Users/shane/Desktop/test1/'
target_dir = '/Users/shane/Desktop/test2/'

file_names = os.listdir(source_dir)

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.testhi = tk.Button(self)
        self.testhi["text"] = "Move!"
        self.testhi["command"] = self.movefiles
        self.testhi.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                            command=self.master.destroy)
        self.quit.pack(side="bottom")


    def movefiles(self):
        for file_name in file_names:
            shutil.move(os.path.join(source_dir, file_name), target_dir) #for file_name in file_names:  #shutil.move(os.path.join(source_dir, file_name), target_dir)

root = tk.Tk()
app = Application(master=root)
app.mainloop()
  

Комментарии:

1. Да, лучше показывать текущие исходные и целевые каталоги пользователям, используя Label кнопки и, чтобы изменить эти каталоги с помощью filedialog.askdirectory() .

2. Как бы я это реализовал?

3. Неважно, я это исправил.

4. @CommandBlock Вам все еще нужен ответ на этот вопрос? Если вы решили это самостоятельно, подумайте о том, чтобы опубликовать свой ответ для других в будущем.

Ответ №1:

Самым простым способом решения этой проблемы было просто реализовать filedialog.askdirectory() , где он заменил бы путь, который я указал для исходного и целевого каталогов.

Вот так:

 import shutil
import os
import tkinter as tk

source_dir = filedialog.askdirectory()
target_dir = filedialog.askdirectory()

file_names = os.listdir(source_dir)

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.testhi = tk.Button(self)
        self.testhi["text"] = "Move!"
        self.testhi["command"] = self.movefiles
        self.testhi.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                            command=self.master.destroy)
        self.quit.pack(side="bottom")


    def movefiles(self):
        for file_name in file_names:
            shutil.move(os.path.join(source_dir, file_name), target_dir) #for file_name in file_names:  #shutil.move(os.path.join(source_dir, file_name), target_dir)

root = tk.Tk()
app = Application(master=root)
app.mainloop()
  

Комментарии:

1. Вы забыли импортировать filedialog модуль. Лучше двигаться root = tk.Tk() перед двумя askdirectory() , иначе у вас будет два экземпляра Tk() , один из которых создан askdirectory() неявно и root .