Skip to content

Python3 - Global variable 'widget' undefined at the module level

Python3
  • Jeder Python3 Einsteiger dürfte diese Meldung kennen. Auch in meinem Projekt nutze ich einige wenige Variablen an verschiedenen Stellen im Code. Das wirft dann in Pylint diese Fehlermeldung. Im verlinkten Beitrag findet man eine Erklärung warum das so ist.

    global tells python to look for a variable with this name in the global namespace and include it in the local namespace. This means it must exist in the global namespace first.

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    
    m = None  # variable must exist in global namespace first
    
    def show():
        global m  # this creates a local m that is linked to the global m
        m = QWidget()
        m.setWindowTitle("Testing this app")
        m.show()
    
    MYAPP = QApplication(sys.argv)
    show()
    MYAPP.exec_()
    

    Das Beispiel aus dem Beitrag, zeigt das man die Variable im globalen Raum vorher deklarieren muss. Das mache ich jetzt so

    ###############################################
    ## Set global variables to avoid this message
    ## Global variable 'widget' undefined at the module level
    ###############################################
     
    widget = None
    mount_path = None
    restore_path = None
    row = None
    load_data = None
    

    Es wird überall immer erwähnt, das man globale Variablen unbedingt vermeiden soll. Das soll kein guter Programmierstil sein!? Dann habe ich jetzt eine gute Liste, um welche Variablen ich mich kümmern muss und werde diesen Teil so umschreiben, das ich das vermeiden kann.

    Quelle: https://stackoverflow.com/questions/55765372/python-error-global-declared-variable-is-not-declared-in-the-global-scope

  • Ok, da ich gestern schon wieder gelesen habe, das globale Variablen unbedingt zu vermeiden sind, habe ich mich mal dran gesetzt und nochmal drüber nachgedacht. Ausgangslage

    b9604f15-6e82-4865-bc44-f9ab2db2614e-grafik.png

    Die Einträge in der Backup List kann man per Mausklick auswählen und die Nummer des gewählten Eintrages brauch ich überall im Projekt.

    • kann man mit global row machen
    • kann man mit settings.setValue(entry_name, entry_value) machen
    • kann man mit einer Klasse lösen

    Mein erster Ansatz war, das mit global row zu machen. Das funktioniert auch einwandfrei. Mein zweiter Ansatz war, den Eintrag in einer Datei settings zu speichern. Auch das funktionierte einwandfrei. Aber beim Nachdenken, fiel mir dann wieder ein, ich muss mehr mit Klassen machen 😉

    Und genau beim Schreiben dieser Klasse ist mir dann aufgefallen, das das überhaupt nicht nötig ist 🤓

    Man kann sich doch die Zeile direkt holen.

    row = self.listWidget.currentRow()
    

    Die Zeile in allen Funktionen hinzugefügt und die globale Variable row war Geschichte. Jepp, man lernt Stück für Stück dazu...

  • Kein globalen Variablen mehr im Projekt 🙂

    Das Widget ließ sich relativ einfach erledigen.

    Vorher

    #----QPlainTextEdit ----#
    layout = QVBoxLayout()
    widget = QTextEdit()
    widget.setReadOnly(True)
    widget.setLayout(layout)
    setCentralWidget(widget)
    

    Nachher

    #----QPlainTextEdit ----#
    layout = QVBoxLayout()
    self.widget = QTextEdit()
    self.widget.setReadOnly(True)
    self.widget.setLayout(layout)
    self.setCentralWidget(self.widget)
    

    Aufruf dann nicht mehr mit

    # UI
    widget.setHtml("")
    

    sondern mit

    # UI
    mainWin.widget.setHtml("")
    

    Problem erledeigt und hoffentlich auch verstanden 😉

  • Python - Formatumwandlung str -> float

    Python3
    1
    0 Stimmen
    1 Beiträge
    161 Aufrufe
    Niemand hat geantwortet
  • Python - Match-Case Statement

    Python3
    1
    0 Stimmen
    1 Beiträge
    83 Aufrufe
    Niemand hat geantwortet
  • Python - mehrsprachiges GUI

    Python3
    1
    0 Stimmen
    1 Beiträge
    119 Aufrufe
    Niemand hat geantwortet
  • PyQt6 - QRegularExpressionValidator

    Python3
    1
    0 Stimmen
    1 Beiträge
    391 Aufrufe
    Niemand hat geantwortet
  • Python3 - class BackupList

    Python3
    2
    0 Stimmen
    2 Beiträge
    224 Aufrufe
    FrankMF

    Mir hat heute jemand auf Twitter zu meinem Problem geantwortet.

    Das habe ich natürlich direkt, bei einer Tasse Kaffee, ausprobiert. Geht einwandfrei und ein Problem ist damit Vergangenheit. Bei meiner Konstruktion musste ich immer eine Länge für die Liste p vorgeben.

    p = list(range(10))

    Das wird jetzt nicht mehr benötigt. Schön 🙂

    Jetzt muss ich mir das noch in Ruhe anschauen, nachlesen und verstehen.

    Danke für den netten Hinweis!

  • Python3 - JSON

    Python3
    3
    0 Stimmen
    3 Beiträge
    188 Aufrufe
    FrankMF

    ede1a88a-5183-4f85-a602-27650362d532-grafik.png

    Die Backups sollen Namen haben, also habe ich das erweitert. Jetzt sollen diese als Liste rechts angezeigt werden. Das mache ich wie folgt.

    for key in backups: print(backups[key]['name'], key) liste = backups[key]['name'] + " ID: " + key self.listWidget.addItem(liste)

    Mittels des Keys kann ich auf den Namen zugreifen und die Liste damit füllen. Aktuell habe ich noch den Key hinten angefügt, weil ich noch keine Idee habe, wie ich die Backups anders verarbeiten soll. Aber, Stück für Stück. Der Backup-Name wird nach Auswahl in der Statusbar angezeigt. So weit klappt das so wie ich mir das vorstelle. Für heute ist Feierabend 😇

  • Python3 - Globale Variablen

    Python3
    1
    0 Stimmen
    1 Beiträge
    128 Aufrufe
    Niemand hat geantwortet
  • Python3 - RegEx für ein LineEdit

    Python3
    2
    0 Stimmen
    2 Beiträge
    153 Aufrufe
    FrankMF

    Gut, Menschen die mich kennen, wissen das IPv6 nicht so mein Spezialgebiet ist. Es hilft aber nichts, auch damit muss man sich beschäftigen 🙂

    Es war etwas schwierig was Passendes zu finden, aber ich denke das hier ist ganz gut. Ob es alle Möglichkeiten bei IPv6 beinhaltet, weiß ich nicht zu 100%.

    Hier eine Seite, wo ich was Passendes gefunden habe.
    https://ihateregex.io/expr/ipv6/

    Code # regex für IPv6 reg_ex = QRegExp('^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$') input_validator = QRegExpValidator(reg_ex, self.lineedit2_ipv6) self.lineedit2_ipv6.setValidator(input_validator)

    Ein paar Test von mir ergaben, das es so aussieht als wenn es funktioniert 🙂