Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

A Б Ученик (126), на голосовании 3 дня назад
Через функцию всё работает при нажатии кнопки, но эту функцию нужно прикрутить ко многим кнопкам изменив '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()
Голосование за лучший ответ
Рустам Абдрашитов Мыслитель (8536) 1 месяц назад
 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()
Татьяна Просветленный (36334) 1 месяц назад
 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()
Похожие вопросы