Erstes GUI- ComboBox in Variable schreiben und Verbesserungsvorschläge

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo @__deets__

    Danke für deine Antwort :)

    Ich versuche mal deine Hilfestellung für mich zu übersetzen. Du meinst ich habe einen Gültigkeitsbereich vergessen und zwar die Instanz( Objekte,Methoden?) meiner Klasse?

    Bedeutet das für mich, das ich die Definition des Player in die "def __init__" setze und dann darauf zugreife wie du in deinem Beispielcode. Hier liest du in Zeile 17 die Variable aus "def __init__" aus ? Die Referenz liegt dabei auf "wert" und wie immer auf "self".

    So wie ich das verstehe ist die Ausgabe von Zeile 17: "instanz wert"

    Da verstehe ich den Sinn nicht. Zu was schreibe ich "wert" in die Funktion "__init__" ?

    Wenn ich deinen Code ausführen will, habe ich genau mit diesem "wert" aus "__init__" auch eine Fehlermeldung.

    Also ich verstehe teilweise (hoffe ich doch), was du mir sagen willst. Für das Verständnis habe ich deinen Code kommentiert, um wieder zugeben was meiner Meinung nach, die einzelnen Codezeilen bedeuten:

    Was du mir ab Zeile 20 sagen willst, weis ich leider nicht wirklich:/

    Danke und Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Erstes GUI- ComboBox in Variable schreiben und Verbesserungsvorschläge? Schau mal ob du hier fündig wirst!

  • Was bitte hast du fuer eine Fehlermeldung? Ich habe den Code ausgeuehrt.

    Und ab Zeile 20 zeige ich auf, warum globaler Zustand schlecht ist. Weil er Zusammenhaenge herstellt, die man schwer durchschaut, und die deshalb ueberraschen und zu Fehlern fuehren koenenn. Natuerlich ist in so einem Spielbeispiel das alles noch gut zu ueberreissen, das ja der Sinn des ganzen.

  • War ein Kopierfehler von mir, Entschuldigung.

    Ich verstehe den Zusammenhang von den 3 Code-Abschnitten nicht:

    Python
        def __init__(self, wert):       
            self.instanz_wert = wert    
    Python
        def instanz_variable(self):     
            print("instanz", self.instanz_wert)
    Python
    a = Foo("das erste")

    Die Ausgabe ist "instanz das erste", wie hängt dabei das "a" mit dem "wert" zusammen?

    a ist die Klasse "Foo" und die Klasse Foo beinhaltet den String "das erste"? Wie und wo wird das hier übergeben?

    Ich erkenne die Zusammenhänge nicht.

    Danke für deine Mühe und Gedult.

    Grüße Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo zusammen,

    habe mir wirklich Mühe gegeben, das offizielle Tutorial (Link von @__deets__ )durchzuarbeiten. Meine bescheidenen Englischkenntnisse brachten mich aber schnell an meine Grenzen:rolleyes:

    Ziemlich am Anfang wird dieser Code gezeigt:

    Hier wird "spam" als nonlocal deklariert und wird dann mit "do_nonlocal()" aufgerufen.

    Das würde ich gerne auf meinen Code anwenden.

    Die Definition des Players steht nun im richtigen Scope, allerdings muss ich die Variable "url" auch als nonlocal deklarieren, damit sie für den Player mit dem richtigen Inhalt zur Verfügung steht.

    Ich bekomme aber folgende Fehlermeldung:

    SyntaxError: no binding for nonlocal 'url' found

    Der SyntaxError-Fehler wird ja angezeigt, wenn Python nicht weis, was ich damit meine. Ich verstehe nun nicht wieso es in meinem Code nicht geht und in dem aus dem Tutorial geht es.

    Hier ist mein aktueller Code:

    Ich will nun in der Funktion "clickme" die Variable url als nonlocal deklarieren, damit der der Player darauf zugreifen kann.

    Sorry wenn das Grundlagefragen sind, aber wenn man jedes zweite Wort in einen Übersetzer eingeben muss, verliert der Satz seine Aussage ?(

    Danke vorab und Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Für Python möcht ich dir von anfang an als Editor und Entwicklungstool PyCharm ans Herz legen.

    Theorie für Python: Python3 - Das umfassende Handbuch

    PyCharm hast du dir ja schon installiert sagtest du, setz dir einen Breakpoint, und steppe Schritt für Schritt durch den Code, dann siehst du ganz deutlich, dass __init__() einmalig bei der Instanzierung des Objektes aufgerufen wird.

    Eine Instanz ist eine Kopie der Klasse. Die Klasse ist als Blaupause zu verstehen.

    man kann x Instanzen (Kopien) einer Klasse erstellen.

    In meinem empfohlenen Buch würde das ganze in Deutsch ab Seite 338 erklärt werden. __init__() im Detail auf Seite 344.

    Ich habe das hier schonmal versucht zu verdeutlichen, vielleicht hilft dir das Beispiel weiter:

    RE: Wie sage ich es in Python ? (Einsteigerfragen)

  • Du verrennst dich da - nonlocal ist nicht die Loesung fuer dein Problem. Das ist eine Technik, die man nur als Fortgeschrittener braucht, um flexibler mit sogenannten Closures umzugehen. Das ist nicht deine Baustelle.

    Wenn du kein Englisch kannst, ist das zum programmieren ganz allgemein erstmal doof. Denn bei weitem das meiste Material findest du nur in Englisch.


    Fuer eine Spracheinfuehrung ist das allerdings nicht zwinged so - es gibt eine deutsche Uebersetzung des Python-Tutorials:

    https://py-tutorial-de.readthedocs.io/de/python-3.3/

    Die Version 3.3 ist zwar schon ein paar Jaehrchen aelter, aber die Geschichte von Adam & Eva hat sich seitdem ja nicht veraendert.

    Nachtrag zu deinem Code da oben: das ganze VLC-Gedoens zu Beginn der Klasse gehoert IN die Klasse, in den Konstruktor. Du erstellst da so wie du das machst eine Klassen-Variable. Nicht eine Instanzvariable. Das ist so, als ob jeder BMW dieser Erde sich den gleichen Steuerknueppel teilen muesst. Was zu ziemlichem Chaos fuehren wuerde.

  • Ersteinmal vielen Danke Hofei und @__deets__ für eure Bemühung und Gedult mit mir:thumbup::danke_ATDE:

    PyCharm hast du dir ja schon installiert

    Ja habe ich, der Radiocode läuft aber so unter Windows nicht. Werde deinen verlinkten Code aber mit Breakpoints versehen und mir den Ablauf anschauen.

    Dein Buchtipp habe ich nicht vergessen, nur noch nicht bestellt. Wenn ich jedoch etwas Fuß fassen kann in dieser Welt, werde ich es nachholen :thumbup:

    Wenn du kein Englisch kannst, ist das zum programmieren ganz allgemein erstmal doof. Denn bei weitem das meiste Material findest du nur in Englisch.


    Fuer eine Spracheinfuehrung ist das allerdings nicht zwinged so - es gibt eine deutsche Uebersetzung des Python-Tutorials:


    https://py-tutorial-de.readthedocs.io/de/python-3.3/

    Das habe ich leider auch festgestellt, naja in meinem bisherigen Beruf war Englisch nicht von großer Bedeutung und für den Urlaub hat es bis jetzt gereicht ^^

    Neues Hobby, neue Herausforderung, ich arbeite mich durch die Übersetzung durch.

    Nochmals Danke euch, freut mich echt das ich hier unterstützt werde :)

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Um dieses Problem kümmere ich mich dann, wenn der rießen Berg an Unklarheiten vor mir, etwas überschaubarer ist. :blush:

    Habe mir das Kapitel "Klassen" aus dem Tutorial durchgelesen und auch deinen Code mit Breakpoints durchgespielt.

    Das hat mir soweit geholfen, das ich mich entschieden habe das empfohlene Buch zu besorgen und nochmal in Ruhe von vorne anzufangen.

    Ich erhoffe mir davon ein ordentliches Grundverständnis aufzubauen und dadurch weitere Erklärungen und Tutorials auch richtig zu verstehen :thumbup:

    Wenn das ok ist, würde ich dieses Thema so belassen und mich bei Unklarheiten wieder melden und/oder spätestens wenn es an dem Radio-Code weiter geht :)

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Guten Abend zusammen,

    nach dem Motto "Rom wurde auch nicht an einem Tag gebaut" taste ich mich Schritt für Schritt an mein Radio-Programm.

    Habe den alten Code gelöscht und neu angefangen uuuuuuuund es funktioniert! :bravo2::love:

    So, bis jetzt ist der Code überschaubar. Ich kann zwischen 2 Sender wählen und kann das ganze starten und stoppen. Bevor ich jetzt aber weiter mache würde ich natürlich gerne wissen, was ich jetzt schon verbessern kann?

    Würde mir gleich angewöhnen wollen, die Programme so aufzubauen, wie ihr richtigen Programmierer es auch machen würdet :)

    Danke schon einmal für eure Bemühungen und einen schönen Abend noch.

    Grüße Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Bevor ich jetzt aber weiter mache würde ich natürlich gerne wissen, was ich jetzt schon verbessern kann?

    Du hast mehrere PEP-8-Verletzungen in deinem Programm (https://www.python.org/dev/peps/pep-0008/ - createWidgets, Sender). das sollte behoben werden.

    Die letzten drei Zeilen sollten auch noch in eine Funktion (z.B. main), die dann mit einem if __name__ == "__main__":-Konstrukt aufgerufen wird (mehr info hier: https://stackoverflow.com/questions/4191…if-name-main-do)

    Variablennamen sollten aussagekräftig sein - op, lst und var sind es nicht. Wieso versuchst du, Buchstaben zu sparen?

    Du verletzt mit der Wiederholung der Sendernahmen das DRY-Prinzip - du könntest einfach eine Konstante für die Sender definieren (als dict) und statt lst dict.keys() verwenden.

  • ergänzend zu #35:

    du könntest/solltest auch sogenannte doc-strigs in deinen funktionen verwenden, welche die funktion und die variablen beschreiben ... damit du nach monaten noch weißt, was du da (überhaupt) programmiert hast UND warum ... kommentare sind auch niemals verkehrt ...

    laut standard:

    1. vor der klasse MyApp ZWEI leerzeilen

    2. Zeile 16 zu lang (max. 79 Zeichen) => zeile umbrechen

    3. Zeile 28, 29: kein leerzeichen vor dem doppelpunkt. diese zeilen sind ebenso zu lang => zeile umbrechen

    beispielsweise:

    übrigens: ich mag diese sender auch

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

    Einmal editiert, zuletzt von Perlchamp (10. Juni 2020 um 06:06)

  • Schon viel gutes!

    Neben den schon gemacht Anmerkungen noch ein paar hinterher:

    - wenn du das Woerterbuch mit den Sendern als Argument uebergibst, kann deine Klasse deutlich einfacher erweitert werden.

    - sowohl text als auch command fuer die Buttons kann man schon bei deren Konstruktion angeben.

    - der media player sollte nur *einmal* erzeugt werden, und dann immer bei Senderwahl der entsprechende Teil laufen, welcher den VLC-Player anweist, den Stream zu spielen.

    - dann kannst du dir auch die Methoden start und stop sparen, denn dann kannst du die Buttons schon gleich zu Beginn an self.player.stop etc binden.

  • Die Zeilen 28 und 29 in Deinem Code sind, abgesehen von den bereits erwähnten PEP8-Verletzungen, ansonsten zu 100% richtig. :thumbup:
    Hätte ich nicht besser hingebracht ;)
    SCNR!

  • ich benutze max. 79 zeichen ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!