updated some stuff (not worthy of a vb!)
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import csv
|
||||
import os
|
||||
import re
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
|
||||
def select_file(callback=None):
|
||||
def set_choice(choice):
|
||||
@@ -15,23 +16,23 @@ def select_file(callback=None):
|
||||
callback(filename)
|
||||
else:
|
||||
start_app(filename)
|
||||
|
||||
|
||||
select_window = tk.Tk()
|
||||
select_window.title("Wähle eine Liste")
|
||||
select_window.geometry("300x200")
|
||||
|
||||
|
||||
label = tk.Label(select_window, text="Bitte eine Liste wählen:", font=("Arial", 12))
|
||||
label.pack(pady=10)
|
||||
|
||||
|
||||
spar_button = tk.Button(select_window, text="SPAR", command=lambda: set_choice("SPAR"), width=15)
|
||||
spar_button.pack(pady=5)
|
||||
|
||||
|
||||
hofer_button = tk.Button(select_window, text="HOFER", command=lambda: set_choice("HOFER"), width=15)
|
||||
hofer_button.pack(pady=5)
|
||||
|
||||
|
||||
wiki_button = tk.Button(select_window, text="Wiki", command=lambda: set_choice("Wiki"), width=15)
|
||||
wiki_button.pack(pady=5)
|
||||
|
||||
|
||||
select_window.mainloop()
|
||||
|
||||
class CSVViewerApp:
|
||||
@@ -39,95 +40,129 @@ class CSVViewerApp:
|
||||
self.root = root
|
||||
title = "PFANDLISTE - SPAR" if "SPAR" in filename else "PFANDLISTE - HOFER"
|
||||
self.root.title(title)
|
||||
self.root.geometry("600x400")
|
||||
|
||||
self.root.geometry("800x600")
|
||||
|
||||
self.label = tk.Label(root, text=title, font=("Arial", 16, "bold"))
|
||||
self.label.pack(pady=10)
|
||||
|
||||
|
||||
self.frame = tk.Frame(root)
|
||||
self.frame.pack(fill=tk.BOTH, expand=True)
|
||||
|
||||
self.tree = ttk.Treeview(self.frame)
|
||||
|
||||
self.tree = ttk.Treeview(self.frame, show="headings")
|
||||
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||
|
||||
|
||||
self.scrollbar = ttk.Scrollbar(self.frame, orient="vertical", command=self.tree.yview)
|
||||
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
|
||||
|
||||
|
||||
self.tree.configure(yscroll=self.scrollbar.set)
|
||||
|
||||
|
||||
# Create a frame for search functionality and style it
|
||||
search_frame = tk.Frame(root, pady=10, padx=20)
|
||||
search_frame.pack(fill=tk.X)
|
||||
|
||||
self.search_label = tk.Label(search_frame, text="Search:", font=("Arial", 12), anchor="w")
|
||||
self.search_label.pack(side=tk.LEFT)
|
||||
|
||||
self.search_entry = tk.Entry(search_frame, font=("Arial", 12), relief="solid", borderwidth=2)
|
||||
self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=10)
|
||||
self.search_entry.bind("<KeyRelease>", self.search)
|
||||
|
||||
self.load_csv(filename)
|
||||
|
||||
def load_csv(self, filename):
|
||||
|
||||
def search(self, event):
|
||||
search_term = self.search_entry.get().lower()
|
||||
for row in self.tree.get_children():
|
||||
self.tree.delete(row)
|
||||
self.load_csv(self.filename, search_term)
|
||||
|
||||
def load_csv(self, filename, search_term=""):
|
||||
self.filename = filename
|
||||
try:
|
||||
with open(filename, newline='', encoding='utf-8') as file:
|
||||
reader = csv.reader(file)
|
||||
headers = next(reader, None)
|
||||
|
||||
self.tree['columns'] = headers
|
||||
|
||||
self.tree["columns"] = headers
|
||||
self.tree.heading("#0", text="#") # First column for index
|
||||
self.tree.column("#0", width=50)
|
||||
|
||||
self.tree.column("#0", width=50, anchor="center")
|
||||
|
||||
for header in headers:
|
||||
self.tree.heading(header, text=header)
|
||||
self.tree.column(header, anchor="center")
|
||||
|
||||
|
||||
for i, row in enumerate(reader, start=1):
|
||||
self.tree.insert("", "end", text=i, values=row)
|
||||
if any(search_term.lower() in str(cell).lower() for cell in row):
|
||||
self.tree.insert("", "end", text=i, values=row)
|
||||
except FileNotFoundError:
|
||||
print(f"Error: {filename} not found!")
|
||||
except Exception as e:
|
||||
print(f"Error loading CSV: {e}")
|
||||
|
||||
## Doesnt really work yet
|
||||
## In the Future maybe
|
||||
def format_markdown(text_area, text):
|
||||
text_area.tag_configure("bold", font=("Arial", 10, "bold"))
|
||||
text_area.tag_configure("center", justify="center")
|
||||
|
||||
text_area.delete("1.0", tk.END)
|
||||
|
||||
segments = []
|
||||
last_end = 0
|
||||
|
||||
for match in re.finditer(r'<p align="center">(.*?)</p>|\*\*(.*?)\*\*', text, re.DOTALL):
|
||||
segments.append((text[last_end:match.start()], None))
|
||||
|
||||
if match.group(1): # Centered text
|
||||
segments.append((match.group(1), "center"))
|
||||
elif match.group(2): # Bold text
|
||||
segments.append((match.group(2), "bold"))
|
||||
|
||||
last_end = match.end()
|
||||
|
||||
segments.append((text[last_end:], None))
|
||||
|
||||
for segment, tag in segments:
|
||||
text_area.insert(tk.END, segment, tag if tag else "")
|
||||
def sort_column(self, col):
|
||||
data = [(self.tree.item(item)["values"], item) for item in self.tree.get_children("")]
|
||||
data.sort(key=lambda x: x[0][col])
|
||||
for idx, item in enumerate(data):
|
||||
self.tree.move(item[1], '', idx)
|
||||
|
||||
def right_click_menu(self, event):
|
||||
selected_item = self.tree.selection()
|
||||
menu = tk.Menu(self.root, tearoff=0)
|
||||
menu.add_command(label="Copy", command=lambda: self.copy_cell(selected_item))
|
||||
menu.post(event.x_root, event.y_root)
|
||||
|
||||
def copy_cell(self, selected_item):
|
||||
# Copy data from the selected row to clipboard
|
||||
if selected_item:
|
||||
row_values = self.tree.item(selected_item[0])["values"]
|
||||
self.root.clipboard_clear()
|
||||
self.root.clipboard_append(' | '.join(row_values))
|
||||
|
||||
def open_wiki():
|
||||
wiki_window = tk.Tk()
|
||||
wiki_window.title("Wiki")
|
||||
wiki_window.geometry("500x400")
|
||||
|
||||
|
||||
text_area = tk.Text(wiki_window, wrap=tk.WORD)
|
||||
text_area.pack(expand=True, fill=tk.BOTH)
|
||||
|
||||
|
||||
filename = os.path.join("PfandApplication/wiki", "wiki.md")
|
||||
|
||||
|
||||
try:
|
||||
with open(filename, "r", encoding="utf-8") as file:
|
||||
content = file.read()
|
||||
format_markdown(text_area, content)
|
||||
except FileNotFoundError:
|
||||
text_area.insert(tk.END, f"Fehler: '{filename}' nicht gefunden!")
|
||||
|
||||
|
||||
wiki_window.mainloop()
|
||||
|
||||
def format_markdown(text_area, text):
|
||||
text_area.tag_configure("bold", font=("Arial", 10, "bold"))
|
||||
text_area.tag_configure("center", justify="center")
|
||||
|
||||
text_area.delete("1.0", tk.END)
|
||||
|
||||
segments = []
|
||||
last_end = 0
|
||||
|
||||
for match in re.finditer(r'<p align="center">(.*?)</p>|\*\*(.*?)\*\*', text, re.DOTALL):
|
||||
segments.append((text[last_end:match.start()], None))
|
||||
|
||||
if match.group(1): # Centered text
|
||||
segments.append((match.group(1), "center"))
|
||||
elif match.group(2): # Bold text
|
||||
segments.append((match.group(2), "bold"))
|
||||
|
||||
last_end = match.end()
|
||||
|
||||
segments.append((text[last_end:], None))
|
||||
|
||||
for segment, tag in segments:
|
||||
text_area.insert(tk.END, segment, tag if tag else "")
|
||||
|
||||
def start_app(filename):
|
||||
root = tk.Tk()
|
||||
app = CSVViewerApp(root, filename)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
select_file()
|
||||
|
||||
if __name__ == "__main__": select_file()
|
||||
Reference in New Issue
Block a user