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.
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.
Çok faydalı oldu. Çok teşekkür ederim vakit ayırdığınız için. İyi çalışmalar dilerim.