Я создал окно tkinter с кнопкой Select file
, чтобы применить функцию DataCheck
к файлам Excel один за другим со следующим кодом:
import tkinter as tk
from tkinter import filedialog, messagebox
from data_check import DataCheck
def on_quit():
if messagebox.askokcancel('Confirmation', 'Do you really want to quit?'):
root.destroy()
def open_file():
file = filedialog.askopenfilename(filetypes=(('Excel Files', '.xlsx'),))
if file:
DataCheck(file)
root = tk.Tk()
btn = tk.Button(root, text='Select file', command=open_file)
btn.pack()
root.protocol('WM_DELETE_WINDOW', on_quit)
root.mainloop()
Допустим, я хочу добавить еще одну кнопку со следующей функцией для открытия папок, как я могу сделать это с помощью tkinter? Большое спасибо.
def open_directory():
directory = filedialog.askdirectory()
for filename in os.listdir(directory):
if filename.endswith('.xlsx') or filename.endswith('.xls'):
fuullname = os.path.join(directory, filename)
if fullname:
DataCheck(fullname)
btn2 = tk.Button(root, text = 'Select folder', command = open_directory)
Код для справки:
root = Tk()
dict_words = {1: "open_file",
2: "open_directory"
}
for k, j in dict_words.items():
b = Button(root, width=20, text=j, padx=5, pady=5)
b.pack()
root.mainloop()
Следующий код работает, но есть одна проблема: после того, как я выбираю и запускаю один файл, он автоматически открывает папку.
import tkinter as tk
from data_check import DataCheck
from tkinter import filedialog, messagebox
import os
def on_quit():
if messagebox.askokcancel('Confirmation', 'Do you really want to quit?'):
root.destroy()
def open_file():
file = filedialog.askopenfilename(filetypes = [('Excel files', '.xlsx .xls .csv')])
if file:
DataCheck(file)
def open_directory():
directory = filedialog.askdirectory()
for filename in os.listdir(directory):
if filename.endswith(".xlsx") or filename.endswith(".xls"):
fullname = os.path.join(directory, filename)
if fullname:
DataCheck(fullname)
root = tk.Tk()
dict_func = {1: 'open_file',
2: 'open_directory'
}
for k, j in dict_func.items():
b = tk.Button(root, width = 20, text = j, padx = 5, pady = 5, command = lambda: [open_file(), open_directory()])
b.pack()
root.protocol('WM_DELETE_WINDOW', on_quit)
root.mainloop()
Вы можете использовать текст кнопок в качестве ключей и ссылки на функции в качестве значений словаря dict_func
, как показано ниже:
dict_func = {"Open File": open_file,
"Open Directory": open_directory}
Затем создайте кнопки с помощью dict, как показано ниже:
for name, func in dict_func.items():
tk.Button(root, width=20, text=name, padx=5, pady=5, command=func).pack()
command = lambda: [open_file(), open_directory()]
позвонитopen_file()
, а потомopen_directory()
. Итак, то, что вы сказали, проблема - ожидаемый результат.