我正在使用 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()
我从您的代码中看到的是,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 方法也适用,它不会在输出中的任何位置附加字符串。