Python'da okutulan excelveriyi editleme aracı

Arkadaşlar merhaba
Öncekikle herkese sağlıklı günler diliyorum. Şöyle bir sorunum var. Tkinter ile bir araç yazıyorum. Elimdeki excel verisini okuttuktan sonra bir pencereye basıp hücre hücre editlenebilir yapmak istiyorum. Nasıl yapacağımı bilmiyorum yardımcı olabilir misiniz?

Merhaba, en son nereye kadar geldiniz, paylaşabileceğiniz bir kod var mı?

import tkinter as tk
import pandas
import numpy as np 
import math 
from tkinter import messagebox
from tkinter import filedialog

def yenicalisma():
    veri=filedialog.askopenfilename(initialdir="C:",title="Exel Dosyasını Gösterin.")
    veri=pandas.read_excel(veri, mode="r")
def düzenle():
    pass
def rapor():
    pass
def benzerlik():
    pass
def afin():
    pass
def projektif():
    pass
def ucboyut():
    pass
def dlt():
    pass

pen=tk.Tk()
pen.title("Fotogrametri Tool")
pen.geometry("500x500+300+100")
menubar=tk.Menu(pen)
pen.config(menu=menubar)
file=tk.Menu(menubar)
file.add_command(label="Yeni Çalışma",command=yenicalisma)
file.add_command(label="Düzenle",command=düzenle)
file.add_command(label="Rapor Çıkart",command=rapor)
transformation=tk.Menu(menubar)
transformation.add_command(label="Benzerlik Dönüşümü",command=benzerlik)
transformation.add_command(label="Afin Dönüşümü",command=afin)
transformation.add_command(label="Projektif Dönüşüm",command=projektif)
transformation.add_command(label="Üç Boyutlu Koordinat Dönüşümleri",command=ucboyut)
transformation.add_command(label="Direkt Lineer Transformasyon",command=dlt)
kalibrasyon=tk.Menu(menubar)
menubar.add_cascade(label="Dosya",menu=file)
menubar.add_cascade(label="Dönüşümler",menu=transformation)
menubar.add_cascade(label="Kalibrasyon",menu=kalibrasyon)
tk.mainloop()

Henüz taslak halinde ama beklentim "yeni çalışma"ya tıkladığımda excel verisini alıp “pen” adlı pencereye basan, "düzenle"ye tıkladığımda bu veriyi hücre hücre düzenleyip değişiklikleri kaydetmemi sağlayan bir yapı yapmak. Ama acemi olduğumdan bir yolunu bulamadım. Yardımcı olabilirseniz çok sevinirim.

Kodunuzu şuraya göre atabilir misiniz:

Başka kodlarla, yapmak istediğinize benzer bir uygulama yaptım, isterseniz bir inceleyin. Kendinize göre değiştirin. Her ayrıntıyı düşünmedim. Onları da sizin düşünmeniz, araştırmanız ve uygulamanız gerekiyor.

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import pandas as pd
import tkinter as tk

from xlsxwriter.workbook import Workbook
from tkinter.messagebox import showinfo
from tkinter.filedialog import askopenfilename


class Spreadsheet(Workbook):
    def __init__(self, data: dict = {}, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sheet = self.add_worksheet()
        self.data = data
        self.write()
        self.close()

    def format(
            self,
            bold: bool = False,
            align: str = "",
            font_name: str = "Arial",
            font_size: int = 11
    ):
        return self.add_format(
            {
                "bold": bold,
                "align": align,
                "valign": "vcenter",
                "font_name": font_name,
                "font_size": font_size
            }
        )

    def write(self):
        columns = set(k[1] for k, v in self.data.items())
        for k, v in self.data.items():
            self.sheet.set_column(min(columns), max(columns), 25)
            if k[0] == 0:
                self.sheet.write(
                    *k,
                    v.get(),
                    self.format(bold=True, align="center")
                )
            else:
                try:
                    value = int(v.get())
                except ValueError:
                    value = v.get()
                self.sheet.write(
                    *k,
                    value,
                    self.format(align="center")
                )


class Menu(tk.Menu):
    def __init__(self, frame: tk.Frame = None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.master.configure(menu=self)
        self.frame = frame
        self.filename = None
        self.entries = None
        self.open_menu = tk.Menu(master=self, tearoff=False)
        self.add_cascade(
            label="Open",
            menu=self.open_menu
        )
        self.open_menu.add_command(
            label="File",
            command=self.open_file
        )

    @staticmethod
    def create_entries(df, master):
        entries = {}
        for i, column in enumerate(df.columns.values):
            entry = tk.Entry(master=master, font="Default 9 bold")
            entry.grid(row=0, column=i)
            entry.insert("insert", column)
            entries[(0, i)] = entry
        for i, row in enumerate(df.values, 1):
            for j, column in enumerate(row):
                entry = tk.Entry(master=master)
                entry.grid(row=i, column=j)
                entry.insert("insert", column)
                entries[(i, j)] = entry
        return entries

    def open_file(self):
        try:
            self.filename = askopenfilename(
                filetypes=[("Excel Files", ".xlsx")]
            )
            self.entries = self.create_entries(
                    df=pd.read_excel(self.filename),
                    master=self.frame
            )
        except (FileNotFoundError, ValueError):
            pass


class Frame(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack()
        self.master.resizable(width=False, height=False)
        self["width"] = 800
        self["height"] = 600
        self.menu = Menu(frame=self)
        self.button = tk.Button(
            master=self.master,
            text="Save",
            command=self.save_excel
        )
        self.button.pack()

    def save_excel(self):
        if self.menu.entries:
            Spreadsheet(
                filename=self.menu.filename,
                data=self.menu.entries
            )
            showinfo(title="Info", message="Saved.")


def main():
    Frame(master=tk.Tk()).mainloop()


main()

Şöyle örnek bir dosya oluşturdum:


Program açılışta şöyle bir ekranla açılıyor:

Dosya seçiyorsunuz:

Seçtiğiniz dosyanın verileri programa aktarılıyor.
2020-04-17 20-27-58 ekran görüntüsü

Daha sonra bu entry widgetlerinde yapacağınız herhangi bir değişiklik, Save düğmesine basarsanız, excel dosyanızda da değişikliklere neden olur.

3 Beğeni

Çok faydalı oldu. Çok teşekkür ederim vakit ayırdığınız için. İyi çalışmalar dilerim.