Wo ist der fehler

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Dienstag 30. Mai 2017, 22:00

Finde hier einen Fehler nicht und weiß auch nicht mehr weiter. Kann mir jemand dabei helfen?

Code: Alles auswählen

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import random
import string

string_seletion = (string.ascii_uppercase, string.ascii_lowercase, string.digits, string.punctuation)

def generate_password(lenght_password, select_text):
    auswahl = ""
    for ic, e in zip(select_text,string_seletion):
        if ic:
            auswahl += e
    return "".join(random.choice(auswahl) for _ in range(lenght_password))


class Application(Frame):

    def print_value(self, val):
        if self.groß.get() + self.klein.get() + self.zahl.get() == 0 + self.sonder.get() == 0:
            self.g.select()
            self.groß.set(1)
        selection = (self.groß.get(), self.klein.get(), self.zahl.get(),self.sonder.get())
        text_password = generate_password(int(val), selection)
        self.Ausgabe.config(state='normal')
        self.Ausgabe.delete(0, 'end')
        self.Ausgabe.insert('end', text_password)

    def move_scroll(self, *L):
        op, howMany = L[0], L[1]
        if op == "scroll":
            units = L[2]
            self.Ausgabe.xview_scroll(howMany, units)
        elif op == "moveto":
            self.Ausgabe.xview_moveto(howMany)

    def createWidgets(self):

        #Erstellung des Label Frames
        labelfr = LabelFrame(self, text="Bitte gewünschte Zeichen Auswählen", padx=10, pady=10)
        labelfr.grid()

        #Erstellung der Checkbuttons
        self.groß = IntVar()
        self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß).grid(row=3, column=0, padx=5, pady=5)
        self.klein = IntVar()
        self.k = Checkbutton(labelfr, text="Kleinbuchstaben", variable=self.klein).grid(row=4, column=0, padx=5, pady=5)
        self.zahl = IntVar()
        self.z = Checkbutton(labelfr, text="Zahlen", variable=self.zahl).grid(row=3, column=1, padx=5, pady=5, sticky=W)
        self.sonder = IntVar()
        self.s = Checkbutton(labelfr, text="Sonderzeichen", variable=self.sonder).grid(row=4, column=1, padx=5, pady=5)

        # Einstellung der Passwortlänge
        self.slider = Scale(self, from_=1, to=200, orient='horizontal', length="3i", label="Passwortlänge",
                            command=self.print_value).grid(row=4, column=0, padx=5, pady=5)

        # Ausgabefenster
        Ausgabe = Entry(self, width=50, state="disable").grid(row=5, column=0, padx=5, pady=0)

        #Scrollleiste der Ausgabe
        Ausgabescrollen = Scrollbar(self, orient="horizontal",command = self.move_scroll).grid(row=6, column=0, padx=5, pady=0, sticky= EW )

        # quit button
        self.Beenden = Button(self, text="Beenden", fg="red", command=quit).grid(row=8, column=0, padx=5, pady=10)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack(expand="YES")
        self.createWidgets()

root = Tk()
root.title("Passwortgenerator")
app = Application(master=root)
app.mainloop()
Zuletzt geändert von Anonymous am Dienstag 30. Mai 2017, 23:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 30. Mai 2017, 22:39

@tigerwood: woher weißt Du, dass es einen Fehler gibt? Was willst Du und was macht das Programm statt dessen? Wenn Du einen Fehler nicht findest, deutet das darauf hin, dass Du zu viel Code geschrieben hast, den Du nicht ausreichend getestet hast. Gehe also dort hin zurück, wo das Programm noch funktioniert hat und schreibe es Schritt für Schritt neu auf, immer und teste es, bis der Fehler auftritt, dann weißt Du, wo er auftaucht.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Dienstag 30. Mai 2017, 22:49

Wurde ja gemacht, eigentlich muss das Ausgabefeld für das Passwort noch aktiv sein, habe es auch schon mit ähnlichen Programmen vergliechen.Ist alles gleich und trotzdem läuft es nicht.

In Zeile 20: self.g.select()
immer die Meldung: AttributeError: 'NoneType' object has no attribute 'select'

bei einem anderen Programm genau so geschrieben und es läuft da.

Hätte noch eine Sache die man Testen kann ich weiß nur nicht genau wie es geht.

Wie bekomme ich hier:

self.slider = Scale(self, from_=1, to=200, orient='horizontal', length="3i", label="Passwortlänge",command=self.print_value).grid(row=4, column=0, padx=5, pady=5)

diesen Befehl mit rein:


self.slider.pack(side='top', fill='x')

Versuche es ja schon seit Stunden. Habe es mit einem Programm verglichen mit diesem pack und mit einem mit den Grid Koordinaten. Wenn ich bei dem Programm mit dem pack die oben angegebene Zeile lösche passiert das gleiche wie bei mir. Nehme deswegen mal an, das es doch bei mir auch irgendwie daran liegt. ich weiß eben nur nicht wie oben geschrieben ich diese pack als grid schreiben muss

self.slider = Scale(self, from_=1, to=200,orient='horizontal',length="3i",label="Passwortlänge",command=self.print_value)
self.slider.pack(side='top', fill='x')

self.slider = Scale(self, from_=1,to=200,orient='horizontal', length="3i",label="Passwortlänge",command=self.print_value).grid(row=4, column=0, padx=5, pady=5)


Kenne mich nun mal damit nicht aus. Bin Student aber nicht Informatik sondern Angewandte Geodäsie, müssen aber auch etwas Programmierung machen.
Wäre eben toll wenn sich das jemand mal kopieren kann und sich das anschaut, ihr würdet mir damit sehr helfen und für die Profis hier doch auch nicht so schwer.
BlackJack

Dienstag 30. Mai 2017, 23:32

@tigerwood: Gleich kann es nicht sein, dann würde es ja laufen. ;-)

Du bindest nicht das `Checkbutton`-Objekt an `self.g` sondern den Rückgabewert von dem `grid()`-Aufruf auf diesem Objekt. Und `grid()` gibt ”nichts” zurück, also den Wert `None`.

Ich verstehe aber nicht warum Du überhaupt auf das `Checkbutton`-Objekt zugreifen möchtest, denn Du verwendest ja ein `IntVar`-Objekt für den Wert dieses Eingabeelements.

Das hat auch mit `grid()` und `pack()` überhaupt nichts zu tun. Davon darfst Du im gleichen Containerwidget nur eines nehmen, also den ganzen Inhalt entweder mit `grid()` *oder* mit `pack()` anordnen. Wenn man die mischt, können komische Sachen passieren, bis hin dazu, dass das Programm hängen bleibt, weil sich die beiden Layoutmanager nicht einig werden können wie das Endergebnis aussehen soll.

Schau Dir mal die Dokumentation vom `tkinter`-Modul an und folge dort auch Links zu externer Dokumentation. Die von Effbot und die von der New Mexico Tech sind auf jeden Fall lesenswert und hilfreich.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Mittwoch 31. Mai 2017, 01:21

Ich verstehe da nicht genau was du damit alles meinst bei diesen Fachbegriffen und bei diesen Dokumentationen ebenfalls nicht. Interessiere mich nun mal nicht für Programmierung. Muss es nur wegen meinem Studium machen.

Verstehe es nicht das jemand mir die Zeilen nicht ändern kann wo der fehler ist und mir die hier wieder hier reinschreiben kann :( . Verstehe nun mal nichts von diesen ganzen Fachegriffen.
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 31. Mai 2017, 06:52

@tigerwood: wenn Dein Studium das erfordert, dann mußt Du das lernen; nebenbei bemerkt helfen einem Programmierkenntnisse im Berufsleben immer. Die willst Geodäsie studieren, da wirst Du also mit Messdaten zu tun bekommen und wirst wahrscheinlich nicht wie zu Gauß' Zeiten mit Deinem Notizblock durch die Landschaft ziehen, und auch sonst nicht Millionen von Zahlen von Hand verarbeiten wollen. Zur Zeit scheinst Du noch mit Zusammenklauen von Code weiter zu kommen, das wird Dir aber spätestens zur Klausur und im nächsten Semester nichts mehr helfen. Also setzt Dich jetzt mit dem Thema auseinander, auch wenn mir GUI-Programmierung zum Einstieg etwas seltsam vorkommt und nicht wirklich nützliche Kenntnisse vermittelt. Hier wird Dir (hoffentlich) niemand die Lösung einfach präsentieren. Wir geben aber Tipps, wo Du was ändern kannst.

Dazu mußt Du aber auch lernen, Probleme zu erkennen und präzise Fragen zu stellen (wieder so eine Fertigkeit, die man auch außerhalb der Informatik immer brauchen kann). Welche Fachbegriffe sagen Dir nichts, welcher der Hinweise, die BlackJack gegeben hat ist für Dein Problem in erster Linie relevant, welche deuten aber auf ein Problem, das noch versteckt ist, aber morgen schon auftauchen könnte? Woran hakt es, dass Du die Lösungen, die BlackJack gegeben hat, nicht umsetzen kannst?
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Mittwoch 31. Mai 2017, 07:49

Ich verstehe es allgemein nicht wie ich dort welchen Button mit was verbinden muss. In der Prüfung müssen wir diese Oberflächen ja auch nicht machen sondern nur Programme die Zahlen ausgeben, sollen zu den Oberflächen nur jetzt mal ein Programm schreiben. Deswegen ist mir das egal mit den Oberflächen ob ich es jetzt hier verstehe oder nicht. Mit Programmen die nur Zahlen oder so ausgeben, wie z.B. das Hallo Welt Programm, Funktioniert bei mir ja alles. Programmierung haben wir nur 1 Semester. Für die Programme gibt es auch noch die Geoinformatik bei uns. Vermessungsungen werden immer noch viel per Hand geschrieben und gerechnet. Bin vom Beruf her bereits Vermessungstechniker. Mathe müssen wir beherschen, müssen auch in der Lage sein einen sinus usw. im Kopf rechnen zu können. In den Matheklausuren heißt es bei uns immer kein Taschenrechner.

Weil die Oberflächen bei uns wie gesagt egal sind hoffe ich mal weiter das es hier noch jemand gibts der was ändern kann oder genauer und verständlicher das erklären kann bei vielen anderne wird hier auch immer eine Veränderung der Zeile neu reingeschrieben. Warum kann mir hier jetzt nicht genau so jemand helfen. Ich verstehe die Fachbegriffe eben nicht. Weiß jetzt auch nicht mit dem anbinden was mit was muss verbunden sein wo ist dieses grid() None usw. Kurz gesagt den gesamten Text.

In dem Passwortgenerator soll man oben auswählen können welche zeichen unten verschiebt man wie lang und da drunten soll der dann ausgegeben werden. Bis jetzt habe ich das Programm gesamt selber geschrieben, finden nur diesen fehler nicht habe bestimmt auch schon 6 Stunden gesucht und finde den nicht.
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 31. Mai 2017, 08:36

@tigerwood: wenn man nicht weiß, wie man Suchen soll, hilft es nicht Stundenlang im Nebel rumzustochern. Du hast eine Fehlermeldung, in der steht, dass "self.g" vom Typ NoneType ist, heißt soviel wie, dass der Wert None ist. Dann mußt Du Dir erst einmal klar werden, was Deine Erwartung an dieser Stelle ist. Die ist, gehe ich mal davon aus, dass self.g vom Typ CheckBox ist. Nun mußt Du suchen, wo self.g seinen Wert bekommt. Das ist in der Zeile, wo ein Objekt vom Typ Checkbox erzeugt wird und darauf die Methode grid aufgerufen wird und dessen Rückgabewert dann an self.g gebunden wird. Und da sollte Dir dann klar werden, dass Du gar nicht den Rückgabewert der Methode grid an self.g binden willst, sondern das Checkbox-Objekt.
Keine dieser Überlegungen hat jetzt konkret was mit GUI-Programmierung zu tun, sondern dieses Vorgehen ist für jeden Fehler bei jedem Programm ähnlich: Was sind die Erwartungen? Wo weichen die Erwartungen von der Realität ab?
BlackJack

Mittwoch 31. Mai 2017, 09:21

@tigerwood: Programmierung habt ihr als *Fach* vielleicht nur im ersten Semester, aber das ist ziemlich sicher nicht losgelöst, so dass man das was man dort lernt, im Rest des Studiums nicht mehr benötigen wird.

Sehr wahrscheinlich hat die Uni Python nicht ohne Grund als Programmiersprache gewählt, denn das ist beispielsweise in ArgGIS eine Möglichkeit Plugins und Skripte zu schreiben. Es ist also durchaus nicht abwegig zu vermuten, dass ihr in irgendeiner anderen Veranstaltung die Aufgabe bekommt Vorgänge in ArcGIS, oder einer ähnlichen Software, zu automatisieren. Und zwar mit der Benutzereingabe für Parameter und/oder Dateiauswahl als Tkinter-GUI. Zu dem Zeitpunkt werden die Dozenten davon ausgehen, dass keine Zeit mehr für das lernen von Python und Tk-GUIs benötigt wird, weil das ja im ersten Semester in einer dedizierten Veranstaltung vermittelt wurde. Dann musst Du es am Ende doch selber lernen, und das auch noch unter mehr Zeitdruck als jetzt.

Studenten aus den Geo-Fächern die genau solche Aufgaben bekommen, haben hier in der Vergangenheit schon öfter Fragen gestellt. Das ist also nichts was ich mir ausgedacht habe um des Arguments willen oder um Dich zu ärgern/nerven/… oder so.

Das viel mit der Hand aufgeschrieben und gerechnet wird, kann ich mir fast gar nicht vorstellen. Das hat doch *sehr* deutliche Grenzen was die Menge angeht, die man auf diese Weise bewältigen kann. Und auch *was* man damit machen kann. Wenn man bereits digitalisierte, grössere Datenbestände herein bekommt, und die oder irgendwelche daraus ableitbaren Eigenschaften beispielsweise visualisieren soll, dann wird man doch doch nicht mit dem Taschenrechner und Stiften bewaffnet tun‽ Es kann sein, dass man da im Studium noch einiges manuell macht, einfach um die Grundlagen zu lernen, aber in der Praxis wird das dann doch mit dem Rechner erledigt. Dafür wird man dann Python, Matlab, irgendwelche GIS-Software, CAD-Software, … verwenden, wofür man oft die Daten aufbereiten, umrechnen, kombinieren, filtern, … muss. Und dazu braucht man dann Programmierkenntnisse.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Mittwoch 31. Mai 2017, 14:48

Finde es einfach schade das mir hier nicht mal jemand etwas besser helfen kann. Muss das Programm in 2 Tagen fertig haben sonst hat man keine zulassung zur Prüfung. Ich weiß eben nicht weiter schaue schon wieder seit Stunden was ihr da meint, probiere rum und teste komme aber nicht weiter. Bin teilweise schon am verzweifeln. Habe andere gefragt aus meinem Studiengang und die habe geschaut verstehen so richtig aber auch nicht was ihr da meint. Wir sollen eben alle unterschiedliche Programme schreiben. Hatte schon gedacht das es hier Personen gibt´s die jemanden helfen der nach fast 2 Tagen suchen jetzt immer noch nicht weiter ist. Was Sirius3 da schreibt verstehen wir hier auch alle nicht so richtig was gemeint ist. :(
Anscheind kann man hier also von keinem Hilfe erwarten. Echt schade.
BlackJack

Mittwoch 31. Mai 2017, 15:25

@tigerwood: Nicht helfen können ist so eine Sache. Es ist wohl eher so das Dir bei dem was Du an Hilfe haben möchtest, keiner helfen will, denn Du schreibst ja doch recht deutlich das Dich das alles nicht wirklich interessiert, und das Du nichts lernen, sondern einfach nur eine Lösung präsentiert haben möchtest. Vielleicht hätte man vorher schon mal auf das Thema An alle Schüler und Studenten mit Informatikproblemen hinweisen sollen.

Andererseits ist es fraglich ob man Dir wirklich helfen *kann* wenn Du in nur zwei Tagen Python soweit lernen musst um alles bis zu objektorientierter Programmierung, ereignisbasierter Programmierung, und einem GUI-Rahmenwerk mit all seinen Komponenten, halbwegs zu verstehen und zu beherrschen. Tutorials und Bücher die das vermitteln gibt es viele. In der Python-Dokumentation ist beispielsweise ein Tutorial.

Du hast jetzt auch immer noch nicht geschrieben was genau Du/Ihr von den Antworten nicht versteh(s)t.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Mittwoch 31. Mai 2017, 17:29

Versuche es ja auch selber zu lösen, sitze hier ja weiter und suche. Eure Aussagen hier verstehe ich auch nicht ganz was verbunden werden muss usw. Anscheind muss doch irgendwie nur eine Zeile geändert werden und dann würde es doch gehen weil irgendeine bindung falsch ist. Ein Buch dazu habe ich ja auch bin dem nach gegangen und kontrolliert aber kann trotzdem nur sagen ich finde nichts. Diese ganze GUI ist für uns nicht wichtig sollen nur 1 mal ein Programm damit machen. In unserer Prüfung kommt das überhaupt nicht dran. Ich sage ja auch nicht das wir nur 2 Tage Zeit haben, sondern das ich jetzt noch 2 Tage habe. 1 Woche hatten wir bin hier ja am suchen nur finde die Lösung nicht. Suche heute ja auch schon mehrere Stunden schaue im Buch und Internet trotzdem finde ich den Fehler nicht schon seit 4 Tagen suche ich, weil ich wohl das nicht ganz richtig verstehe :K . Hätte schon gedacht das man etwas hilfe erwarten kann. Vor allem wenn es eine Sache ist die recht wichtig ist und ich schon am verzweifeln bin. Schade das bei allen ein Bereich geändert wird und dann die Zeile neu hier reingeschrieben wird. Bei mir wird es nicht gemacht, warum? Hilfe kann ich hier also nicht erwarten, dachte es ist ein Forum wo man sich bei Problemen hilft, dann muss ich hier leider alles abbrechen auch mein Studium. Kann also teilweise sagen danke das ihr mir nicht mal helfen wollt und bei mir vieles kaputt geht
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 31. Mai 2017, 17:48

@tigerwood: ich verstehe halt nicht, warum Du meine Hilfestellungen nicht verstehst. Wenn ich schreibe, schau in der Zeile nach, in der "self.g" ein Wert zugewiesen wird, weiß ich nicht, wie ich das noch anders formulieren soll, dass Du die Zeile findest, wo der Fehler steckt. :K
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Mittwoch 31. Mai 2017, 18:18

Du meinst in dieser Zeile?
self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß).grid(row=3, column=0, padx=5, pady=5)

Was muss in der Zeile denn geändert werden? Dort wird doch nur der Checkbutton erstellt mit der zuweisung self.g
BlackJack

Mittwoch 31. Mai 2017, 18:28

@tigerwood: Nach einem Buch gehen und kontrollieren klingt nicht wirklich nach der Ebene von Verständnis die man benötigt. Schauen ob das im Buch so ähnlich aussieht, heisst ja nicht das man verstanden hat was da passiert. Und dort wo `self.g` der `None`-Wert zugewiesen wird, wird das im Buch sicher nicht so gemacht, denn das macht keinen Sinn auf diese Weise `None` an Attribute zu binden. Das Attribut macht dann an sich keinen Sinn. Und eigentlich macht das Attribut auch in Deinem Programm keinen Sinn, denn Du verwendest ja `IntVar`-Objekte für den Zustand der `Checkbutton`-Objekte. Damit sollte man auf das `Checkbutton`-Objekt selbst gar nicht mehr zugreifen müssen.

Sirius3 hat es ja schon gesagt: Das grundsätzliche Problem dort hat nichts mit GUI-Programmierung zu tun. Verstehen wie Ausdrücke ausgewertet werden und die Fehlersuche wie Sirius3 sie beschrieben hat, muss man bei jedem Programm. Wenn man einen Ausdruck hat in dem ein Objekt erzeugt wird und dann gleich eine Methode auf dem Objekt aufgerufen wird, dann hat der Ausdruck das Ergebnis dieses Methodenaufrufs und nicht das Objekt auf dem die Methode aufgerufen wurde. Das ist *immer* so. Egal ob das Objekt ein Eingabeelement, eine Liste, eine Wörterbuch, oder irgend etwas anderes ist.

Code: Alles auswählen

In [1]: print([2,4,1].sort())  # Ist nicht [1, 2, 4]
None

In [2]: print([2,4,1].append(42))  # Ist nicht [2, 4, 1, 42]
None
Also nein, in der Zeile wird nicht das `Checkbutton`-Objekt an `self.g` gebunden, sondern der Rückgabewert vom `grid()`-Aufruf auf dem `Checkbutton`-Objekt. Und der ist `None`.

Also wenn daran jetzt tatsächlich das gesamte Studium hängen sollte, dann muss da vorher oder parallel ja noch einiges anderes subobtimal gelaufen sein. Es kann ja nicht daran scheitern das man *eine* Vorlesung wiederholen muss. Dann hätte man die Planung etwas zu knapp auf Kante gemacht. Schieb dafür jetzt bitte nicht den Lesern hier die Schuld zu.

*Du* solltest Python lernen. Und die gestellte Aufgabe enthält GUI-Programmierung. Wenn Du das nicht lernen willst, weil es Dich nicht interessiert, dann ist das vielleicht nicht die richtige Einstellung zum Studium. Du weisst auch gar nicht ob ihr das nie wieder braucht. Selbst wenn ihr das hier ganz konkret nie wieder braucht — selbstständig in irgendwelche Software einarbeiten, oder Probleme mit Software mit Skriptingmöglichkeiten lösen, kommt ganz sicher wieder vor. Und wie schon gesagt, irgendwelche GIS-Software in Python skripten und auch einen GUI-Teil dafür zu schreiben, kommt in den Geowissenschaften wirklich, tatsächlich, ehrlich, praktisch vor.
Antworten