tkinter 多个文件选择

问题描述 投票:0回答:1

我正在使用 Tkinter 设计一个界面。我有选择文件的按钮。我希望输入按钮有 2 个不同的选项,例如能够选择单个文件和选择多个文件。对于输出,仅选择一个文件就足够了。但无论我做什么,我都无法选择多个文件。我的整个代码太长了。我会分享必要的地方。

    from functools import partial
import MultiLingualdeneme as ml
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk

class UIHelper:
    def __init__(self, frame):
        self.frame = frame
    def select_input_file(self, input_entry, file_type, title, multiple_files=False):
     
        """Dosya seçici fonksiyonu"""
        # Dosya türlerine göre filetypes belirle
        filetypes = []
        if file_type == "json":
            filetypes = [("JSON files", "*.json")]
        elif file_type == "excel":
            filetypes = [("Excel files", "*.xlsx")]
        elif file_type == "text":
            filetypes = [("Text files", "*.txt")]
        else:
            filetypes = [("All files", "*.*")]
        
        # Çoklu dosya seçimi yapılacaksa, askopenfilenames kullanılır
        if multiple_files:
            files = filedialog.askopenfilenames(title=title, filetypes=filetypes,multiple_files=True,multiple=True)
            input_entry.delete(0, tk.END)
            if files:
                input_entry.insert(0, ', '.join(files))  # Seçilen dosya yollarını virgülle ayırarak ekle
        else:
            # Tek dosya seçimi yapılacaksa, askopenfilename kullanılır
            file = filedialog.askopenfilename(title=title, filetypes=filetypes)
            input_entry.delete(0, tk.END)
            if file:
                input_entry.insert(0, file)  # Seçilen dosya yolunu ekle
    def select_output_file(self, entry, file_type, title, default_extension,multiple_files=False):
        """Çıkış dosyasını seçer ve yolu entry'ye ekler."""
        output_file = filedialog.asksaveasfilename(defaultextension=default_extension, title=title, filetypes=[file_type])
        entry.delete(0, tk.END)
        entry.insert(0, output_file)
        

    

    def create_file_selector(self, label_text, file_type, command, multiple_files=False, default_extension=None):
        """Dosya seçici alan oluşturur ve döndürür."""
        file_frame = tk.Frame(self.frame)
        file_frame.pack(pady=10)
        tk.Label(file_frame, text=label_text).pack(side=tk.LEFT)
        entry = tk.Entry(file_frame, width=40)
        entry.pack(side=tk.LEFT)

        # 'partial' kullanarak komut fonksiyonunu parametreler ile çağırıyoruz
        if default_extension:
            button_command = partial(command, entry, file_type, multiple_files, default_extension)
        else:
            button_command = partial(command, entry, file_type, multiple_files)
        
        tk.Button(file_frame, text="Dosya Seç", command=button_command).pack(side=tk.LEFT)
        return entry
class Tab:
    def __init__(self, frame, title, input_file_type, output_file_type, image_paths, convert_function, 
                 column_name_required=False, target_language_required=False, 
                 description_text="",multiple_files=False):
        self.frame = frame
        self.title = title
        self.input_file_type = input_file_type
        self.output_file_type = output_file_type
        self.image_paths = image_paths
        self.convert_function = convert_function
        self.column_name_required = column_name_required
        self.target_language_required = target_language_required
        self.description_text = description_text
        self.multiple_files=multiple_files
        self.helper = UIHelper(frame)

    def show_ui(self):
        input_entry = self.helper.create_file_selector(
            "Giriş Dosyası:", self.input_file_type,
            self.helper.select_input_file,
            multiple_files=self.multiple_files
        )
        output_entry = self.helper.create_file_selector(
            "Çıkış Dosyası:", self.output_file_type,
            self.helper.select_output_file,
            multiple_files=False,  # Çıkış dosyası için sadece tek dosya seçilecek
            default_extension=".xlsx"  # Çıkış dosyasının varsayılan uzantısı
        )
        convert_button = tk.Button(self.frame, text="Dönüştür", 
                                   command=lambda: self.convert(input_entry, output_entry))
        convert_button.pack(pady=10)
def create_main_window():
    # Ana pencere oluşturuluyor
    root = tk.Tk()
    root.title("Multilingual")
    root.geometry("800x600")
    
    # Yardımcı sınıf ve model sınıfı oluşturuluyor
    

    # Ana pencere için çerçeve oluşturuluyor
    frame = tk.Frame(root)
    frame.pack(fill=tk.BOTH, expand=True)
    
    # Menü çubuğu oluşturuluyor
    menu_bar = tk.Menu(root)

    tales_tab_compare_to_translation = Tab(
        frame,
        "Tales Compare Translations",  # Başlık
        ("JSON files", "*.json"),  # Giriş dosyası türü
        ("JSON files", "*.json"),  # Çıkış dosyası türü
        ["path_to_image1.png", "path_to_image2.png"],  # Görseller
        lambda input_file, output_file, target_language: ml.compare_tales_translations(input_file, target_language, output_file),  # Dönüştürme fonksiyonu
        target_language_required=True,  # Hedef dil girişini aktif eder
        description_text="Verilen iki masal çevirisini karşılaştırır ve farkları gösterir.",  # Açıklama metni
        multiple_files=True  # Çoklu dosya desteği aktif
    )

    tales_menu = tk.Menu(menu_bar, tearoff=0)
    tales_menu.add_command(label="Compare Translations", command=tales_tab_compare_to_translation.show_ui)
    menu_bar.add_cascade(label="Tales", menu=tales_menu)
    root.config(menu=menu_bar)

    return root

create_main_window().mainloop()
tkinter tkinter-entry tkinter-button
1个回答
0
投票

我从您的代码中看到的是,ypu 正在尝试使用 .join() 方法将所有文件名放入条目中。我认为你不应该使用变量

multiple_files
而是简单地从 filedialog 获取所有文件。 在 filedialog 中,用户可以使用 CTRL 键一次选择多个文件,因此如果它在您的完整程序中确实很重要,您可以使用
files = filedialog.askopenfilenames(title=title, filetypes=filetypes) if len(files) == 1: #do special functionality for single file elif len(files) > 0: #do special functionality for multiple files else: print("no files have been selected")
或者,如果唯一的目的是在条目中显示它,您可以这样做:
files = filedialog.askopenfilenames(title=title, filetypes=filetypes) if len(files) == 0: print("no files entered") else: input_entry.insert(0, ", ".join(files)

当列表中只有一个元素时,Join 方法也适用,它不会在输出中的任何位置附加字符串。

© www.soinside.com 2019 - 2024. All rights reserved.