Verschlüsselungsprogramm

Fragen zu Tkinter.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

meine frage ist: kann ich anstatt threads auch prozesse nehmen.
Ich werde das jetzt in eine klasse umschreiben da es anders nicht geht.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was genau erhoffst du dir von einem Prozess? Auch dessen zustand musst du irgendwie in deine Programm bekommen. Das ist nicht einfacher als es in einem thread zu machen.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

ich würde das mit einer queue machen. Ich finde prozesse einfacher zu programmieren. Die Wahrscheinlichkeit ist grösser das der prozess einen eigenen kern bekommt
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann mach’s mit nem Prozess. An der Notwendigkeit die GUI mit Klassen zu schreiben ändert das nichts. Weswegen ich die Frage verwirrend fand.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Sehr dumme Frage, aber könnte mir jemand meinen aktuellen Code in eine Klasse schreiben?
Wenn ich diese Klasse hätte könnte ich nämlich weiter machen mit den Prozessen.
Ich hatte schon ein Paar mal versucht, aber irgendwie macht es nie sinn. :?
Ich hatte noch nie eine GUI mit Klassen geschrieben.
Ich währe euch sehr dankbar. :D

Code: Alles auswählen

import base64
import os
import tkinter as tk
import Fernet
import pygame.mixer
from tkinter import ttk
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

BLOCK_GRÖSSE = 4096

def generiere_Schlüssel(passwort, salt=False):
    passwort = passwort.encode()
    return_tuple = False
    if not salt:
        salt = os.urandom(16)
        return_tuple = True
        
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(passwort))
    if return_tuple:
        return schlüssel, salt
    else:
        return schlüssel

def verschlüsseln(passwort, dateipfad):
    schlüssel, salt = generiere_Schlüssel(passwort)
    fernet = Fernet.FernetStream(schlüssel)
    encryptor = fernet.encryptor()
    with open(dateipfad, "rb") as datei:
        with open(dateipfad + ".verschluesselt", "wb") as datei_verschlüsselt:
            datei_verschlüsselt.write(salt)
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_verschlüsselt.write(encryptor.update(block))
            datei_verschlüsselt.write(encryptor.finalize())
    
    pygame.mixer.music.play()
def entschlüsseln(passwort, dateipfad):
    dateiname, _ = os.path.splitext(os.path.basename(dateipfad))
    with open(dateipfad, "rb") as datei:
        with open(os.path.join(os.path.dirname(dateipfad), dateiname + ".entschluesselt"), "wb") as datei_entschlüsselt:                
            salt = datei.read(16)
            schlüssel = generiere_Schlüssel(passwort, salt)
            f = Fernet.FernetStream(schlüssel)
            decryptor = f.decryptor()
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_entschlüsselt.write(decryptor.update(block))
            datei_entschlüsselt.write(decryptor.finalize())
    pygame.mixer.music.play()
            

def GUI():
    root = tk.Tk()
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
    
    style = ttk.Style()
    settings = {"TNotebook.Tab": {"configure": {"padding": [5, 1],
                                                "background": "white"
                                               },
                                  "map": {"background": [("selected", "white"), 
                                                         ("active", "#bdbdbd")],

                                         }
                                  }
               }  
    style.theme_create("alles_weiss", parent="alt", settings=settings)
    style.theme_use("alles_weiss")
    style.configure("TNotebook", background="white")
    style.configure("TFrame", background="white")
    
    root_tab = ttk.Notebook(root)
    tab1 = ttk.Frame(root_tab) 
    tab2 = ttk.Frame(root_tab)
    
    root_tab.add (tab1, text="Entschlüsseln")
    root_tab.add (tab2, text="Verschlüsseln")
    root_tab.pack(expand=1, fill='both')
       
    info1 = tk.Label(tab1, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    dateipfad_text1 = tk.Label(tab1, text="Bitte Dateipfad angeben", bg="white")
    dateipfad_eingabe1 = tk.Entry(tab1, bg="white")
    passwort_text1 = tk.Label(tab1, text="Bitte Passwort eingeben", bg="white")
    passwort_eingabe1 = tk.Entry(tab1, bg="white")
    entschlüsseln_button = tk.Button(tab1, text="entschlüsseln", command=lambda: entschlüsseln(passwort_eingabe1.get(), dateipfad_eingabe1.get()), bg="white")
    verschlüsseln_button = tk.Button(tab2, text="verschlüsseln", command=lambda: verschlüsseln(passwort_eingabe2.get(), dateipfad_eingabe2.get()), bg="white")
    info2 = tk.Label(tab2, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    dateipfad_text2 = tk.Label(tab2, text="Bitte Dateipfad angeben", bg="white")
    dateipfad_eingabe2 = tk.Entry(tab2, bg="white")
    passwort_text2 = tk.Label(tab2, text="Bitte Passwort eingeben", bg="white")
    passwort_eingabe2 = tk.Entry(tab2, bg="white")

    info1.grid(row=0, columnspan=1, sticky=tk.W)
    dateipfad_text1.grid(row=1, column=0, sticky=tk.W)
    dateipfad_eingabe1.grid(row=1, column=1, sticky=tk.W)
    passwort_text1.grid(row=2, column=0, sticky=tk.W)
    passwort_eingabe1.grid(row=2, column=1, sticky=tk.W)
    info2.grid(row=0, columnspan=1, sticky=tk.W)
    dateipfad_text2.grid(row=1, column=0, sticky=tk.W)
    dateipfad_eingabe2.grid(row=1, column=1, sticky=tk.W)
    passwort_text2.grid(row=2, column=0, sticky=tk.W)
    passwort_eingabe2.grid(row=2, column=1, sticky=tk.W)
    entschlüsseln_button.grid(row=4, columnspan=1, sticky=tk.W)
    verschlüsseln_button.grid(row=4, columnspan=1, sticky=tk.W)
    root.mainloop()

if __name__ == "__main__":
    pygame.mixer.init()
    pygame.mixer.music.load("audio.mp3")
    GUI()
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Musik/Töne abspielen gehört nicht in Ver- und Entschlüsselungsfunktionen. 😲
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

OK kann man rausnehmen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Module werden per Konvention komplett kein geschrieben. Hilft auch bei Dateisystemen, die nicht zwischen Großkleinschreibung unterscheiden. Funktionen sollten möglichst immer die selben Typen als Rückgabewert haben. Es schadet ja nichts, salt wieder zurückzugeben.
Musik-Abspielen gehört nicht zur Aufgabe einer Entschlüsslungsfunktion.

Die Funktion GUI heißt am besten main, weil das ist ja das, was sie macht.
Relative Pfadangaben fix in einer Python-Datei zu haben, ist im Normalfall schlecht, weil man dann das Programm nur aus einem Verzeichnis heraus aufrufen.

`settings` sollte eine Konstante sein. Ich bevorzuge eine andere Einrückform.

Nun mußt Du entscheiden, was eine Klassen umfassen soll. Hier würden sich die beiden Tabs als Klassen eignen.

Code: Alles auswählen

import os
import tkinter as tk
from tkinter import ttk
from fernet import FernetStream
import pygame.mixer
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

BLOCK_GRÖSSE = 4096
SETTINGS = {
    "TNotebook.Tab": {
        "configure": {
            "padding": [5, 1],
            "background": "white",
        },
        "map": {
            "background": [
                ("selected", "white"), 
                ("active", "#bdbdbd"),
            ],
        },
    }
}  

def generiere_schlüssel(passwort, salt=None):
    passwort = passwort.encode()
    if not salt:
        salt = os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    schlüssel = base64.urlsafe_b64encode(kdf.derive(passwort))
    return schlüssel, salt

def verschlüsseln(passwort, dateipfad):
    schlüssel, salt = generiere_schlüssel(passwort)
    fernet = Fernet.FernetStream(schlüssel)
    encryptor = fernet.encryptor()
    with open(dateipfad, "rb") as datei:
        with open(dateipfad + ".verschluesselt", "wb") as datei_verschlüsselt:
            datei_verschlüsselt.write(salt)
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_verschlüsselt.write(encryptor.update(block))
            datei_verschlüsselt.write(encryptor.finalize())

def entschlüsseln(passwort, dateipfad):
    dateiname, _ = os.path.splitext(os.path.basename(dateipfad))
    with open(dateipfad, "rb") as datei:
        with open(os.path.join(os.path.dirname(dateipfad), dateiname + ".entschluesselt"), "wb") as datei_entschlüsselt:                
            salt = datei.read(16)
            schlüssel, _ = generiere_Schlüssel(passwort, salt)
            fernet = FernetStream(schlüssel)
            decryptor = fernet.decryptor()
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_entschlüsselt.write(decryptor.update(block))
            datei_entschlüsselt.write(decryptor.finalize())
    pygame.mixer.music.play()
            

def init_styles():
    style = ttk.Style()
    style.theme_create("alles_weiss", parent="alt", settings=SETTINGS)
    style.theme_use("alles_weiss")
    style.configure("TNotebook", background="white")
    style.configure("TFrame", background="white")

class TabDecrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(self, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(self, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(self, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(self, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(self, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        tk.Button(self, text="entschlüsseln", command=self.decrypt, bg="white"
        ).grid(row=4, columnspan=1, sticky=tk.W)

    def decrypt(self):
        entschlüsseln(self.passwort.get(), self.dateipfad.get())
        pygame.mixer.music.play()
  

class TabEncrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(master, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(master, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(master, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(master, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(master, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        tk.Button(master, text="verschlüsseln", command=self.encrypt, bg="white"
        ).grid(row=4, columnspan=1, sticky=tk.W)

    def encrypt(self):
        verschlüsseln(self.passwort.get(), self.dateipfad.get())
        pygame.mixer.music.play()


def main():
    pygame.mixer.init()
    pygame.mixer.music.load("audio.mp3")
    init_styles()

    root = tk.Tk()
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
    
    root_tab = ttk.Notebook(root)
    tab_decrypt = TabDecrypt(root_tab) 
    tab_encrypt = TabEncrypt(root_tab)
    root_tab.add(tab_decrypt, text="Entschlüsseln")
    root_tab.add(tab_encrypt, text="Verschlüsseln")
    root_tab.pack(expand=1, fill='both')
    root.mainloop()

if __name__ == "__main__":
    main()
Zuletzt geändert von Sirius3 am Montag 4. November 2019, 20:52, insgesamt 1-mal geändert.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

könntest du mal deinen Code ausprobieren? Bei mir erstellt er zwei Fenster und das hauptfenster wird überschrieben. Es kommt kein Fehler, aber danke für deine mühen!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei den Styles schien irgendwas nicht zu stimmen, und noch so ein paar Copy-Paste-Fehler:

Code: Alles auswählen

import os
import tkinter as tk
from tkinter import ttk
from fernet import FernetStream
import pygame.mixer
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

BLOCK_GRÖSSE = 4096
SETTINGS = {
    "TNotebook.Tab": {
        "configure": {
            "padding": [5, 1],
            "background": "white",
        },
        "map": {
            "background": [
                ("selected", "white"), 
                ("active", "#bdbdbd"),
            ],
        },
    }
}  

def generiere_schlüssel(passwort, salt=None):
    passwort = passwort.encode()
    if not salt:
        salt = os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    schlüssel = base64.urlsafe_b64encode(kdf.derive(passwort))
    return schlüssel, salt

def verschlüsseln(passwort, dateipfad):
    schlüssel, salt = generiere_schlüssel(passwort)
    fernet = Fernet.FernetStream(schlüssel)
    encryptor = fernet.encryptor()
    with open(dateipfad, "rb") as datei:
        with open(dateipfad + ".verschluesselt", "wb") as datei_verschlüsselt:
            datei_verschlüsselt.write(salt)
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_verschlüsselt.write(encryptor.update(block))
            datei_verschlüsselt.write(encryptor.finalize())

def entschlüsseln(passwort, dateipfad):
    dateiname, _ = os.path.splitext(os.path.basename(dateipfad))
    with open(dateipfad, "rb") as datei:
        with open(os.path.join(os.path.dirname(dateipfad), dateiname + ".entschluesselt"), "wb") as datei_entschlüsselt:                
            salt = datei.read(16)
            schlüssel, _ = generiere_Schlüssel(passwort, salt)
            fernet = FernetStream(schlüssel)
            decryptor = fernet.decryptor()
            while True:
                block = datei.read(BLOCK_GRÖSSE)
                if not block:
                    break
                datei_entschlüsselt.write(decryptor.update(block))
            datei_entschlüsselt.write(decryptor.finalize())
    pygame.mixer.music.play()
            

def init_styles(root):
    style = ttk.Style(root)
    style.theme_create("alles_weiss", parent="alt", settings=SETTINGS)
    style.theme_use("alles_weiss")
    style.configure("TNotebook", background="white")
    style.configure("TFrame", background="white")

class TabDecrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(self, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(self, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(self, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(self, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(self, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        tk.Button(self, text="entschlüsseln", command=self.decrypt, bg="white"
        ).grid(row=4, columnspan=1, sticky=tk.W)
    def decrypt(self):
        entschlüsseln(self.passwort.get(), self.dateipfad.get())
        pygame.mixer.music.play()
  

class TabEncrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(self, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(self, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(self, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(self, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(self, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        tk.Button(self, text="verschlüsseln", command=self.encrypt, bg="white"
        ).grid(row=4, columnspan=1, sticky=tk.W)
    def encrypt(self):
        verschlüsseln(self.passwort.get(), self.dateipfad.get())
        pygame.mixer.music.play()


def main():
    pygame.mixer.init()
    pygame.mixer.music.load("audio.mp3")

    root = tk.Tk()
    init_styles(root)
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
        
    root_tab = ttk.Notebook(root)
    tab_decrypt = TabDecrypt(root_tab) 
    tab_encrypt = TabEncrypt(root_tab)
    root_tab.add(tab_decrypt, text="Entschlüsseln")
    root_tab.add(tab_encrypt, text="Verschlüsseln")
    root_tab.pack(expand=1, fill='both')
    root.mainloop()

if __name__ == "__main__":
    main()
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

super, musste noch ein bisschen verbessern, aber jetzt läuft er.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

könntest du mir ein link zu einem guten beispiel für tk mit threads posten? mir läuft nur Müll über den Weg.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich wiederhole mich gerne: Mit ein bißchen Suchen findest Du hier im Forum genug Beispiele.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fire Spike hat geschrieben: Dienstag 5. November 2019, 07:25 könntest du mir ein link zu einem guten beispiel für tk mit threads posten? mir läuft nur Müll über den Weg.
Das ist eine DER Standardfragen hier, zu denen die dir ja inzwischen bekannten Forumsgroessen auch schon oft was geschrieben haben. Gelegentlich auch mal mit Code. Da findest du was, ganz bestimmt.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich hatte jetzt mal die Verschlüsselungsfunktion versucht zu anpassen, aber jetzt komme ich nicht mehr weiter...
Ich würde auch noch gerne den Frame deaktivieren aber es gelingt mir nicht :cry: *verzweifelt*

Code: Alles auswählen

import os
import base64
import tkinter as tk
import pygame.mixer
from tkinter import ttk
from fernet import FernetStream
from multiprocessing import Process, Queue
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

BLOCK_GRÖSSE = 4096
SETTINGS = {
    "TNotebook.Tab": {
        "configure": {
            "padding": [5, 1],
            "background": "white",
        },
        "map": {
            "background": [
                ("selected", "white"), 
                ("active", "#bdbdbd"),
            ],
        },
    }
}  

def generiere_schlüssel(passwort, salt=None):
    passwort = passwort.encode()
    if not salt:
        salt = os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    schlüssel = base64.urlsafe_b64encode(kdf.derive(passwort))
    return schlüssel, salt

def verschlüsseln(queue, passwort, dateipfad):
    try:
        schlüssel, salt = generiere_schlüssel(passwort)
        fernet = FernetStream(schlüssel)
        encryptor = fernet.encryptor()
        with open(dateipfad, "rb") as datei:
            with open(dateipfad + ".verschluesselt", "wb") as datei_verschlüsselt:
                datei_verschlüsselt.write(salt)
                while True:
                    block = datei.read(BLOCK_GRÖSSE)
                    if not block:
                        break
                    datei_verschlüsselt.write(encryptor.update(block))
                datei_verschlüsselt.write(encryptor.finalize())
        queue.put(True)
    except Exception as fehler:
        queue.put(fehler)
        
def entschlüsseln(queue, passwort, dateipfad):
    try:
        dateiname, _ = os.path.splitext(os.path.basename(dateipfad))
        with open(dateipfad, "rb") as datei:
            with open(os.path.join(os.path.dirname(dateipfad), dateiname + ".entschluesselt"), "wb") as datei_entschlüsselt:                
                salt = datei.read(16)
                schlüssel, _ = generiere_schlüssel(passwort, salt)
                fernet = FernetStream(schlüssel)
                decryptor = fernet.decryptor()
                while True:
                    block = datei.read(BLOCK_GRÖSSE)
                    if not block:
                        break
                    datei_entschlüsselt.write(decryptor.update(block))
                datei_entschlüsselt.write(decryptor.finalize())
        queue.put(True)
    except Exception as fehler:
        queue.put(fehler)
        
def init_styles(root):
    style = ttk.Style(root)
    style.theme_create("alles_weiss", parent="alt", settings=SETTINGS)
    style.theme_use("alles_weiss")
    style.configure("TNotebook", background="white")
    style.configure("TFrame", background="white")    
        
class TabDecrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(self, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(self, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(self, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(self, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(self, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        tk.Button(self, text="entschlüsseln", command=self.decrypt, bg="white"
        ).grid(row=4, columnspan=1, sticky=tk.W)
        
    def decrypt(self):
        entschlüsseln(self.passwort.get(), self.dateipfad.get())
       # pygame.mixer.music.play()
  

class TabEncrypt(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        tk.Label(self, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white"
        ).grid(row=0, columnspan=1, sticky=tk.W)
        tk.Label(self, text="Bitte Dateipfad angeben", bg="white"
        ).grid(row=1, column=0, sticky=tk.W)
        self.dateipfad = tk.Entry(self, bg="white")
        self.dateipfad.grid(row=1, column=1, sticky=tk.W)
        tk.Label(self, text="Bitte Passwort eingeben", bg="white"
        ).grid(row=2, column=0, sticky=tk.W)
        self.passwort = tk.Entry(self, bg="white")
        self.passwort.grid(row=2, column=1, sticky=tk.W)
        self.button = tk.Button(self, text="verschlüsseln", command=self.encrypt, bg="white")
        self.button.grid(row=4, columnspan=1, sticky=tk.W)
        self.status = tk.Label(self, text="", bg="white")
        self.status.grid(row=5, column=0, sticky=tk.W)
    
    def prozess_überwacher(self):
        queue_werte = self.queue.get()
        if queue_werte or type(queue_werte) == 'str' and len(queue_werte) >= 0:
            self.after_cancel(self.AFTER)
            self.button["state"] = tk.NORMAL
            self.status.config(text=queue_werte)
        
    def encrypt(self):
       # verschlüsseln(self.passwort.get(), self.dateipfad.get())
       # pygame.mixer.music.play()
        self.queue = Queue()
        prozess = Process(target=verschlüsseln, args=(self.queue, self.passwort.get(), self.dateipfad.get()))
        prozess.start()
        self.status.config(text="wird verschlüsselt...")
        self.button["state"] = tk.DISABLED
        self.AFTER = self.after(100, self.prozess_überwacher())

def main():
    pygame.mixer.init()
    pygame.mixer.music.load("audio.mp3")

    root = tk.Tk()
    init_styles(root)
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
        
    root_tab = ttk.Notebook(root)
    tab_decrypt = TabDecrypt(root_tab) 
    tab_encrypt = TabEncrypt(root_tab)
    root_tab.add(tab_decrypt, text="Entschlüsseln")
    root_tab.add(tab_encrypt, text="Verschlüsseln")
    root_tab.pack(expand=1, fill='both')
    root.mainloop()

if __name__ == "__main__":
    main()
Fehler:

Code: Alles auswählen

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/media/usb/.Projekte/Python3/tkinter/Dateiverschluesseln2.py", line 145, in encrypt
    self.AFTER = self.after(100, prozess_überwacher(self))
  File "/media/usb/.Projekte/Python3/tkinter/Dateiverschluesseln2.py", line 87, in prozess_überwacher
    root.after_cancel(root.AFTER)
AttributeError: 'TabEncrypt' object has no attribute 'AFTER'
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Der Traceback passt nicht zum Code. Denn im Traceback steht ``prozess_überwacher(self)``, was einen `NameError` zur Folge haben sollte. Im Code dagegen steht ``self.prozess_überwacher()`` was eher zu dem `AttributeError` im Traceback passt. `after()` musst Du etwas zum Aufrufen übergeben was dann nach der angegebenen Zeit von Tk aufgerufen werden kann. Du aber rufst das schon selbst auf und übergibst den Rückgabewert von der Methoden — wenn die Ausnahme nicht dazwischen käme.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Fire Spike: in eine Queue sollte man nicht verschiedene Typen packen: Exception oder Wahrheitswert. Besser wäre None - kein Fehler und Exception - Fehler. Bei der Abfrage in `prozess_überwachen` prüfst Du dann aber auch noch auf String, wobei man das nicht mit `type(x) == 'str'` macht, weil erstens, type keine Strings als Rückabewert hat und zweitens man statt type isinstance benutzt und drittens man gar nicht explizit auf den Typ prüfen sollte. Dass die Länge eines Strings nicht negativ sein kann, sollte bekannt sein. Das queue.get ist falsch, da es blockiert -> get_nowait.
Wenn einmal die Funktion von `after` durchgelaufen war, muß sie wieder mit `after` angestoßen werden. Das `after_cancel` ist also genau die falsche Aktion.
Alle Attribute sollten schon in __init__ angelegt werden, queue und AFTER kommen aber später dazu, AFTER hält sich auch nicht an die Namenskonvention. `after` braucht als zusätzliches Argument ein Funktionsobjekt, nicht den Rückgabewert der aufgerufenen Funktion.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo, ich dachte schon lange darüber nach und googelte aber ich finde keine lösung für das prozessige problem :( *schämen*
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe gerade nicht, wo Dein Problem ist? Hast Du alle Hinweise, die Du bekommen hast umgesetzt? Wo hakt es dann noch?
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Das

Code: Alles auswählen

Wenn einmal die Funktion von `after` durchgelaufen war, muß sie wieder mit `after` angestoßen werden. Das `after_cancel` ist also genau die falsche Aktion.
Antworten