filedialog und SQLite

Fragen zu Tkinter.
Antworten
we1303
User
Beiträge: 14
Registriert: Montag 22. März 2021, 21:51

Ich bin unzufrieden mit filedialog in Verbindung mit Sql-Dateien. Im Gegensatz zu zB einer CSV- oder Textdatei kann die Sql-Datei mehrere Tabellen enthalten. Die Buttons "Öffnen" und "Sichern" sind damit nicht immer sinnstiftend:
1. Wie wähle ich eine komplette Datei zum Löschen aus (gilt auch für CSV, Text etc.)? Öffnen mit Löschen zu überschreiben ist mir nicht gelungen.
2. Ene Datei zu "öffnen", um darin eine Tabelle zu "löschen" erscheint mir ebenfalls etwas suboptimal.

Sql gibt es seit über 20 Jahren, also sollte es eine funktionsfähige Lösung geben. Kann wohl kaum sein, dass so lange Millionen von Programmierern nicht über dies Problem gestolpert sind. Aber gefunden habe ich nichts. Wer kennt die Lösung?

Vorab vielen Dank
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Ich werde aus deinem Text nicht schlau.
Weniger Prosa und eine kurze präzise Erklärung des Problems wäre in meinen Augen zielführender. Ein FileDialog hat ja erst einmal gar nichts mit SQL zu tun.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@we1303: Es gibt keine allgemeinen SQL-Dateien, der Witz bei Tabellen in relationalen Datenbanken ist ja gerade, dass das alles von Dateien abstrahiert wird. Die Schnittstelle ist SQL und ob und wie die Daten dann in wie vielen oder wenigen Dateien organisiert sind, ist alleine Sache des DBMS das verwendet wird. Und jedes macht das anders. Bei grösseren DBMS kann man da dann auch alles mögliche einstellen, bis hin zu „vergiss Dateisysteme, hier ist eine komplette leere Partition, mach damit was Du willst“. Ein allgemeiner Dateidialog macht im Zusammenhang mit SQL-Datenbanken erst einmal gar keinen Sinn.

So lange es SQL auch schon gibt, AFAIK gibt es keinen allgemeinen Weg Informationen über die Tabellen abzufragen. Das geht (wahrscheinlich) bei jedem DBMS, und oft sind die Informationen selbst als Tabellen abfragbar, aber wie die heissen und wie die Informationen strukturiert sind, unterscheidet sich von DBMS zu DBMS. Manche erweitern auch SQL um Anweisungen. Man muss für so etwas also immer wissen welches DBMS man vor sich hat, und wie dort solche Informationen abfragbar sind.

Konkret bei SQLite kann ein Dateidialog Sinn machen, weil dieses DBMS Datenbanken in Dateien speichert. Wobei es keine standardisierte Dateiendung gibt und es sich auch um mehr als eine Datei pro Datenbank handeln kann, wenn man beispielsweise Eigenschaften wie ein „write ahead log“ aktiviert.

Wenn man eine Tabelle aus einer Datenbank löschen möchte, also eine grafische Benutzeroberfläche für diesen Vorgang zur Verfügung stellen möchte, wird man das in zwei Schritten machen müssen: Datenbank auswählen, und dann Tabelle in der Datenbank auswählen. Wobei das bei anderen DBMS im Grunde ja nicht anders ist, wobei dort oft noch ein Schritt zusätzlich vorher kommt: Server auswählen.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
we1303
User
Beiträge: 14
Registriert: Montag 22. März 2021, 21:51

@sparrow, @__blackjack__:

Sorry,
vielleicht war ich zu sehr in meiner eigenen Denke gefangen. Ja, ich nutze SQLite und ich öffne/sichere über filedialog eine Datei und 'picke' nachfolgend eine Tabelle über ein eigenes PopUp. Die Daten stehen dann nach dem Öffnen der Anwendung zur Verfügung. Jetzt soll zusätzlich Schrott gelöscht werden können, ohne dass ich dafür jedes mal den Code manupulieren muss oder andere Taschenspielertricks.

Das Ganze läßt sich reduzieren auf: Wie nutze ich filedialog (oder ähnliches) um eine Textdatei zu löschen. Bzw. wie umgehe ich, dass filedialog einen Öffnen-Button präsentiert, während ich löschen will.

Danke für die schnelle Reaktion
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@we1303: Das geht nicht. Je nach Plattform verwendet Tk hier unter Umständen auch ”native” Dialoge vom Betriebssystem und bietet deshalb sehr wenig Möglichkeit da irgendwie einzugreifen. Da müsste man sich selbst etwas programmieren, hat dann aber natürlich das Problem, dass sich das anders verhält, also beispielsweise völlig anders bedient wird als der native Dialog und auch nicht die ganze Funktionalität zur Verfügung steht, wie beispielsweise Shortcuts zu Orten wie dem Desktop, dem Heimatverzeichnis, oder eingebundenen lokalen oder entfernten Laufwerken.

Ich würde da einfach öffnen nehmen und das dann auch tatsächlich tun, und die Möglichkeit bieten die gerade geöffnete Datenbank zu löschen. Oft will man ja auch vor dem Löschen mal rein schauen, ob es sich wirklich um die richtige Datenbank handelt. Und wenn man das nicht will, kann man auch einfach den Dateimanager verwenden um einzelne Dateien zu löschen.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
we1303
User
Beiträge: 14
Registriert: Montag 22. März 2021, 21:51

@__blackjack__:

Danke für die schnelle Antwort. Ich hätte erwartet, dass das noch mehr Leute stört als nur mich (gab es nicht früher Spötteleien über Windows: Wähle Start zum Ausschalten). Werde also damit leben (müssen), muss das sowieso hinter 'nem Passwort verstecken. Nochmals Danke.
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Ich bin mir nicht sicher, ob du dich da vielleicht ein bisschen auf einem UI-Holzweg befindest.
Ich erwarte von keinem Programm, dass es mir einen Menüpunkt zur Verfügung stellt, um eine Datei zum Löschen auszuwählen. Es sei denn, es ist ein Dateimanager.
Ich weiß auch ehrlich gesagt nicht, was du meinst, wenn du sagst, da müsste am Code etwas gemacht werden.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

we1303 hat geschrieben: Mittwoch 18. Mai 2022, 12:081. Wie wähle ich eine komplette Datei zum Löschen aus (gilt auch für CSV, Text etc.)? Öffnen mit Löschen zu überschreiben ist mir nicht gelungen.
Versuchs doch mal so:

Code: Alles auswählen

from pathlib import Path
import tkinter as tk
from tkinter import filedialog


def auswahl_datei():
    datei_finder = filedialog.FileDialog(root)
    datei_finder.ok_button['text'] = 'Lösche'    
    datei = datei_finder.go()   
    return datei

def loesche_datei():
    datei = auswahl_datei()
    if datei != None:        
        Path.unlink(Path(datei))

if __name__ == '__main__':
    root = tk.Tk()
    loesche_datei()
    root.mainloop()
Gruss Peter
Antworten