Tkinter Daten Speichern

Fragen zu Tkinter.
Antworten
Vincent:D
User
Beiträge: 2
Registriert: Freitag 10. Juni 2016, 15:58

Freitag 10. Juni 2016, 16:12

Hallo Leute
Ich bin grade an einer kleinen Idee für ein Projekt in der Schule dran(9 Klasse hab grade erst angefangen zu Programmieren ). Es soll ein Passwort geschütztes Textdokument sein... Doch leider weiß ich nicht wie man die eingetragenen Wörter speichern kann. Falls sich das einer ankucken könnte und weiß wie es geht bitte mir eine weniger komplizierte Antwort schicken DANKE ;D Passwort und Username ist: test

Code: Alles auswählen

from tkinter import *  
 
root = Tk(className=' Login')
 
 
 
class LoginFrame(Frame):
    def __init__(self, master):
        super().__init__(master)
 
 
   
 
        self.label_1 = Label(self, text="Username")
        self.label_2 = Label(self, text="Password")
 
        self.entry_1 = Entry(self)
        self.entry_2 = Entry(self, show="*")
 
        self.label_1.grid(row=0, sticky=E)
        self.label_2.grid(row=1, sticky=E)
        self.entry_1.grid(row=0, column=1)
        self.entry_2.grid(row=1, column=1)
 
       
 
        self.logbtn = Button(self, text="Login", command = self._login_btn_clickked)
        self.logbtn.grid(columnspan=3)
 
 
        self.pack()
 
    def _login_btn_clickked(self):
        username = self.entry_1.get()
        password = self.entry_2.get()
 
 
 
  #Account und 2 Fenster  
 
        if username == "test" and password == "test":
 
 
 
            root = Tk(className=' Passwort Speicher')
            frame = Frame(root)
            frame.pack()
            toolbar = Frame(root)
            root.geometry('900x900')
            T = Text(root, height=60, width=120)
            T.pack()
       
 
            mainloop()
 
   
           
           
           
 
           
     
 

 
 
root.geometry('230x100')
lf = LoginFrame(root)
root.mainloop()

          
Zuletzt geändert von Anonymous am Freitag 10. Juni 2016, 18:07, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Freitag 10. Juni 2016, 21:56

@Vincent:D: Was willst Du denn speichern? Benutzername und Passwort ja eher nicht, denn die stehen fest im Programm drin.

Kritik am Quelltext: Die Leerzeilen sind ein bisschen übertrieben und sehen willkürlich aus.

Der Kommentar ist nicht passend zum Code eingerückt.

Sternchen-Importe sollte man vermeiden. Das verwischt die Grenzen zwischen Modulen, so dass man die Idee von der Trennung in verschiedene Namensräume unterläuft. Es macht Programme schwerer durchschaubar und man riskiert Namenskollisionen.

Ebenfalls unübersichtlich ist es das Hauptprogramm und Definitionen von Funktionen oder Klassen auf Modulebene zu vermischen. Das Hauptprogramm steht üblicherweise eine einem Stück in einer `main()`-Funktion.

Das `className`-Argument von `Tk` wird nicht verwendet, und ist auch eher exotisch. Dieses Argument ist *nicht* dazu da den Fenstertitel zu setzen! Dafür haben Toplevel-Widgets eine `title()`-Methode.

Die Fenstergrösse gibt man üblicherweise nicht vor, denn die wird durch den Inhalt des Fensters in der Regel schon ausreichend bestimmt.

Namen sollten nicht aus kryptischen Abkürzungen wie `lf`, `logbtn`, oder `T` bestehen, sondern dem Leser klar vermitteln was der Wert bedeutet. Also beispielsweise `login_frame` und `login_button`. Aus dem gleichen Grund sind nichtssagende Namen wie `entry_1`, `entry_2`, `label_1`, usw. nicht gut. Auch hier weiss man nicht wofür die verwendet werden wenn man nur den Namen liest.

Abgeleitete Widgets sollten sich nicht selber beim erstellen „layouten“. Das macht keines der vorgefertigten Widgets, weil man damit dem Code der es erstellt, die möglichkeit nimmt, zu entscheiden wie es angeordnet werden soll.

Der Name der Methode für das `command`-Argument ist falsch geschrieben. Hier würde ich auch eher etwas generischeres nehmen wie `_on_login()`, wenn man möchte solche Handler auch gerne mal auch über andere Ereignisse aufrufen, zum Beispiel zusätzlich wenn der Benutzer im Passwort-Eingabefeld die Eingabetaste betätigt. Dann wäre eine Methode die `button` und `clicket` im Namen führt, unpassend benannt.

Ein `columnspan` von 3 bei einem Gridlayout in dem nichts in der dritten Spalte ist, macht wenig Sinn.

Es darf immer nur ein `Tk`-Exemplar zur gleichen Zeit im Programm existieren. Das ist *das* Hauptfenster. Zusätzliche Fenster kann man mit `Toplevel`-Exemplaren erstellen.

`frame` und `toolbar` werden erzeugt aber nicht wirklich verwendet.

So als Zwischenergebnis komme ich dann auf so etwas:

Code: Alles auswählen

import tkinter as tk

 
class LoginFrame(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
 
        tk.Label(self, text='Username').grid(row=0, column=0, sticky=tk.E)
        self.username_entry = tk.Entry(self)
        self.username_entry.grid(row=0, column=1)

        tk.Label(self, text='Password').grid(row=1, column=0, sticky=tk.E)
        self.password_entry = tk.Entry(self, show='*')
        self.password_entry.grid(row=1, column=1)
 
        tk.Button(
            self, text='Login', command=self._on_login
        ).grid(row=2, column=0, columnspan=2)

 
    def _on_login(self):
        username = self.username_entry.get()
        password = self.password_entry.get()
        # 
        # Account und 2 Fenster  
        # 
        if username == 'test' and password == 'test':
            window = tk.Toplevel(self)
            window.title('Password Storage')
            tk.Text(window, height=50, width=80).pack()


def main():
    root = tk.Tk()
    root.title('Login')
    login_frame = LoginFrame(root)
    login_frame.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
Sinn macht das teilweise nicht, aber ich weiss auch nicht was es denn nun eigentlich tun soll.

Da `Tk` das Hauptfenster ist, an dem die gesamte GUI hängt, sollte es IMHO nicht für das Anmeldefenster benutzt werden. Denn so ein Fenster verschwindet üblicherweise ja nach der Anmeldung. Man kann es aber nicht schliessen, weil dann die gesamte Anwendung geschlossen wird, inklusive erstellter weiterer Fenster. Man würde also eher mit `Tk` das Hauptfenster bereits erstellen und dann das Anmeldefenster als `Toplevel` modellieren. Oder besser mit `tkSimpleDialog.Dialog` (wo auch immer das jetzt in Python 3 zu finden ist.), dann hat man gleich einen modalen Dialog ohne sich das selber basteln zu müssen und braucht in der Zeit das Hauptfenster nicht zu verstecken.
Vincent:D
User
Beiträge: 2
Registriert: Freitag 10. Juni 2016, 15:58

Freitag 10. Juni 2016, 23:48

Danke für die schnelle Antwort und Hilfe. Aber ich muss wissen wie ich das Speichern kann was man in das Text Fenster rein schreibt. So das ich alles was ich rein geschrieben habe wieder aufrufen kann.
BlackJack

Samstag 11. Juni 2016, 11:19

@Vincent:D: Man holt sich den Text aus dem `Text`-Widget, öffnet eine Textdatei zum schreiben, schreibt den Text dort hinein, und schliesst die Datei. Wie man mit Dateien umgeht steht zum Beispiel im Tutorial in der Python-Dokumentation. Für Tk muss man auf externe Dokumentation ausweichen. Da bietet sich das Online-Buch von Effbot an (http://effbot.org/tkinterbook/text.htm) und als aktuelleres Nachschlagewerk die Seiten vom New Mexico Tech (https://infohost.nmt.edu/tcc/help/pubs/ ... thods.html).
Antworten