Top.Mail.Ru
Ответы

Вопрос по Питону, Tkinter

Через функцию всё работает при нажатии кнопки, но эту функцию нужно прикрутить ко многим кнопкам изменив 'A1' на 'A2' и т.д., задать функции аргумент и подставлять его на место 'A1' не получится из-за того что при присваивании command нельзя указывать аргументы. Как это решить не плодя много сущностей?

today = datetime.date.today ()

fn = 'data.xlsx'
wb = load_workbook(fn)
ws = wb['data_bv']

def bv_time():
ws['A1'] = today.strftime("%d-%m-%Y")
wb.save(fn)
wb.close()

По дате
По рейтингу
Аватар пользователя
Просветленный
9мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
 import datetime 
import tkinter as tk 
from tkinter import messagebox, filedialog 
from openpyxl import load_workbook  # pip install openpyxl 
from functools import partial 
 
 
class ExcelUpdater: 
    def __init__(self, filename, sheetname): 
        """Инициализация класса и попытка загрузки книги Excel""" 
        self.filename = filename 
        self.sheetname = sheetname 
        self.workbook = None 
        self.worksheet = None 
        self.today = datetime.date.today().strftime("%d-%m-%Y") 
        self.load_workbook() 
 
    def load_workbook(self): 
        """Загружает файл Excel и рабочий лист, с обработкой ошибок""" 
        try: 
            self.workbook = load_workbook(self.filename) 
            self.worksheet = self.workbook[self.sheetname] 
        except FileNotFoundError: 
            messagebox.showerror("Ошибка", f"Файл '{ 
                                 self.filename}' не найден.") 
        except KeyError: 
            messagebox.showerror("Ошибка", f"Лист '{ 
                                 self.sheetname}' не найден в книге.") 
        except Exception as e: 
            messagebox.showerror( 
                "Ошибка", f"Произошла ошибка при открытии файла: {e}") 
 
    def update_cell(self, cell): 
        """Обновляет указанную ячейку текущей датой и сохраняет файл""" 
        if not self.workbook or not self.worksheet: 
            messagebox.showerror( 
                "Ошибка", "Невозможно обновить файл. Проверьте, был ли файл корректно загружен.") 
            return 
 
        try: 
            self.worksheet[cell] = self.today 
            self.save_and_close() 
            messagebox.showinfo("Успех", f"Ячейка {cell} обновлена!") 
        except Exception as e: 
            messagebox.showerror( 
                "Ошибка", f"Произошла ошибка при обновлении ячейки: {e}") 
 
    def save_and_close(self): 
        """Сохраняет изменения в файле и закрывает его""" 
        try: 
            self.workbook.save(self.filename) 
            self.workbook.close() 
        except Exception as e: 
            messagebox.showerror("Ошибка", f"Не удалось сохранить файл: {e}") 
 
 
def select_file(): 
    """Открывает диалог для выбора файла Excel""" 
    filetypes = (("Excel files", "*.xlsx"), ("All files", "*.*")) 
    filename = filedialog.askopenfilename( 
        title="Выберите файл Excel", filetypes=filetypes) 
    return filename 
 
 
def create_button(root, updater, cell): 
    """Создаёт кнопку с функцией обновления Excel ячейки""" 
    button = tk.Button(root, text=f"Update { 
                       cell}", command=partial(updater.update_cell, cell)) 
    button.pack() 
 
 
def main(): 
    root = tk.Tk() 
    root.title("Excel Updater") 
 
    # Запрашиваем файл через диалоговое окно 
    filename = select_file() 
    if not filename: 
        messagebox.showerror("Ошибка", "Файл не был выбран.") 
        return 
 
    sheetname = 'data_bv'  # Название листа, который будет обновляться 
 
    # Инициализация класса ExcelUpdater 
    updater = ExcelUpdater(filename, sheetname) 
 
    # Создание нескольких кнопок для обновления разных ячеек 
    cells = ['A1', 'A2', 'A3', 'A4'] 
    for cell in cells: 
        create_button(root, updater, cell) 
 
    root.mainloop() 
 
 
if __name__ == "__main__": 
    main() 
 
Аватар пользователя
Мудрец
9мес
1234567891011121314151617181920
 import datetime 
from openpyxl import load_workbook 
import tkinter as tk 
 
today = datetime.date.today() 
fn = 'data.xlsx' 
wb = load_workbook(fn) 
ws = wb['data_bv'] 
 
def bv_time(cell): 
    ws[cell] = today.strftime("%d-%m-%Y") 
    wb.save(fn) 
    wb.close() 
 
root = tk.Tk() 
for cell in ['A1', 'A2', 'A3']: 
    btn = tk.Button(root, text=f'Update {cell}', command=lambda c=cell: bv_time(c)) 
    btn.pack() 
 
root.mainloop()