|
import os |
|
import sys |
|
import sqlite3 |
|
import tkinter as tk |
|
from tkinter import ttk |
|
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg |
|
import matplotlib.pyplot as plt |
|
import matplotlib |
|
|
|
SUPPORTED_FILE_TYPES = ['.sh', '.bat', '.ps1', '.cs', '.c', '.cpp', '.h', '.cmake', '.py', '.git', '.sql', '.csv', '.sqlite', '.lsl', '.html', '.xml', '.rtf'] |
|
|
|
|
|
matplotlib.rcParams.update({'font.size': plt.rcParams['font.size'] * 0.8}) |
|
|
|
class DatenVisualizer(tk.Tk): |
|
def __init__(self, db_pfad): |
|
super().__init__() |
|
|
|
self.title("Daten Visualizer") |
|
self.geometry("1200x720") |
|
|
|
|
|
self.chars_window = tk.Toplevel(self) |
|
self.chars_window.title("Anzahl der Zeichen") |
|
self.chars_window.geometry("480x360") |
|
self.chars_window.protocol("WM_DELETE_WINDOW", self.close_chars_window) |
|
|
|
|
|
self.chars_frame = ttk.Frame(self.chars_window) |
|
self.chars_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True) |
|
|
|
|
|
self.anzeigen_anzahl_zeichen(db_pfad) |
|
|
|
|
|
self.quality_window = tk.Toplevel(self) |
|
self.quality_window.title("Qualität des Datensatzes") |
|
self.quality_window.geometry("480x360") |
|
self.quality_window.protocol("WM_DELETE_WINDOW", self.close_quality_window) |
|
|
|
|
|
self.quality_frame = ttk.Frame(self.quality_window) |
|
self.quality_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True) |
|
|
|
|
|
self.anzeigen_qualität(db_pfad) |
|
|
|
|
|
self.tree_frame = ttk.Frame(self) |
|
self.tree_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) |
|
|
|
|
|
self.tree = ttk.Treeview(self.tree_frame) |
|
self.tree["columns"] = ("dateipfad", "anzahl_zeilen", "anzahl_zeichen", "long_text_mode", "dimensionalität") |
|
self.tree.heading("#0", text="ID") |
|
self.tree.heading("dateipfad", text="Dateipfad") |
|
self.tree.heading("anzahl_zeilen", text="Anzahl Zeilen") |
|
self.tree.heading("anzahl_zeichen", text="Anzahl Zeichen") |
|
self.tree.heading("long_text_mode", text="Long Text Mode") |
|
self.tree.heading("dimensionalität", text="Dimensionalität") |
|
|
|
self.tree_scroll = ttk.Scrollbar(self.tree_frame, orient=tk.VERTICAL, command=self.tree.yview) |
|
self.tree.configure(yscrollcommand=self.tree_scroll.set) |
|
|
|
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) |
|
self.tree_scroll.pack(side=tk.RIGHT, fill=tk.Y) |
|
|
|
self.lade_daten_aus_db(db_pfad) |
|
|
|
def lade_daten_aus_db(self, db_pfad): |
|
try: |
|
with sqlite3.connect(db_pfad) as conn: |
|
cursor = conn.cursor() |
|
cursor.execute("SELECT * FROM dateiparameter") |
|
daten = cursor.fetchall() |
|
|
|
for row in daten: |
|
self.tree.insert("", tk.END, values=row) |
|
|
|
except sqlite3.Error as e: |
|
print(f"SQLite Fehler: {e}") |
|
except Exception as e: |
|
print(f"Allgemeiner Fehler: {e}") |
|
|
|
def anzeigen_anzahl_zeichen(self, db_pfad): |
|
try: |
|
with sqlite3.connect(db_pfad) as conn: |
|
cursor = conn.cursor() |
|
cursor.execute("SELECT dateipfad, anzahl_zeichen FROM dateiparameter") |
|
daten = cursor.fetchall() |
|
|
|
|
|
plot_figure_chars = plt.Figure(figsize=(6, 4.5), dpi=100) |
|
plot_ax_chars = plot_figure_chars.add_subplot(111) |
|
plot_ax_chars.bar([row[0] for row in daten], [int(row[1]) for row in daten], color='orange') |
|
plot_ax_chars.set_xlabel("Dateipfad") |
|
plot_ax_chars.set_ylabel("Anzahl Zeichen") |
|
|
|
plot_canvas_chars = FigureCanvasTkAgg(plot_figure_chars, master=self.chars_frame) |
|
plot_canvas_chars.get_tk_widget().pack() |
|
|
|
except sqlite3.Error as e: |
|
print(f"SQLite Fehler: {e}") |
|
except Exception as e: |
|
print(f"Allgemeiner Fehler: {e}") |
|
|
|
def anzeigen_qualität(self, db_pfad): |
|
try: |
|
with sqlite3.connect(db_pfad) as conn: |
|
cursor = conn.cursor() |
|
cursor.execute("SELECT * FROM dateiparameter") |
|
daten = cursor.fetchall() |
|
|
|
|
|
anzahl_dateien = len(daten) |
|
durchschnittliche_anzahl_zeichen = sum(int(row[3]) for row in daten) / anzahl_dateien if anzahl_dateien > 0 else 0 |
|
durchschnittliche_anzahl_zeilen = sum(int(row[2]) for row in daten) / anzahl_dateien if anzahl_dateien > 0 else 0 |
|
|
|
|
|
plot_figure_quality = plt.Figure(figsize=(6, 4.5), dpi=100) |
|
plot_ax_quality = plot_figure_quality.add_subplot(111) |
|
plot_ax_quality.bar(["Durchschnittliche Anzahl Zeichen", "Durchschnittliche Anzahl Zeilen"], [durchschnittliche_anzahl_zeichen, durchschnittliche_anzahl_zeilen], color=['skyblue', 'lightgreen']) |
|
plot_ax_quality.set_xlabel("Metrik") |
|
plot_ax_quality.set_ylabel("Durchschnittswerte") |
|
|
|
plot_canvas_quality = FigureCanvasTkAgg(plot_figure_quality, master=self.quality_frame) |
|
plot_canvas_quality.get_tk_widget().pack() |
|
|
|
except sqlite3.Error as e: |
|
print(f"SQLite Fehler: {e}") |
|
except Exception as e: |
|
print(f"Allgemeiner Fehler: {e}") |
|
|
|
def close_chars_window(self): |
|
self.chars_window.destroy() |
|
|
|
def close_quality_window(self): |
|
self.quality_window.destroy() |
|
|
|
def main(db_pfad): |
|
try: |
|
daten_visualizer = DatenVisualizer(db_pfad) |
|
daten_visualizer.mainloop() |
|
|
|
except Exception as e: |
|
print(f"Fehler beim Hauptprogramm: {e}") |
|
|
|
if __name__ == "__main__": |
|
|
|
if len(sys.argv) > 1: |
|
db_pfad = sys.argv[1] |
|
else: |
|
print("Bitte geben Sie den Pfad zur SQLite-Datenbank als Argument an.") |
|
sys.exit(1) |
|
|
|
main(db_pfad) |
|
|