meine frage ist: kann ich anstatt threads auch prozesse nehmen.
Ich werde das jetzt in eine klasse umschreiben da es anders nicht geht.
Verschlüsselungsprogramm
-
- 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
-
- 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.
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.
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()
- __blackjack__
- User
- Beiträge: 13079
- 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
-
- User
- Beiträge: 329
- Registriert: Montag 13. Mai 2019, 16:05
- Wohnort: Erde
OK kann man rausnehmen.
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.
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.
-
- 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!
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()
-
- User
- Beiträge: 329
- Registriert: Montag 13. Mai 2019, 16:05
- Wohnort: Erde
super, musste noch ein bisschen verbessern, aber jetzt läuft er.
-
- 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.
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 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.
-
- 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 *verzweifelt*
Fehler:
Ich würde auch noch gerne den Frame deaktivieren aber es gelingt mir nicht *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()
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'
- __blackjack__
- User
- Beiträge: 13079
- 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
@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.
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.
-
- 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*
-
- 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.