Skip to content

PyQt6 - QSettings

Python3
  • In meinem Restic UI nutze ich PyQt6 und das wollte ich jetzt mal mit PyQt6 ausprobieren. Hatte gedacht, das wäre schnell erledigt -Nein ist es nicht 😉

    PyQt5

    # set path for user directory
    PATH = (USERHOME + '/' '.restic_ui' + '/' + FILE)
    
    settings = QSettings(PATH, QSettings.IniFormat)
    

    PyQt6

    Das wirft aber in PyQt6 nur einen Traceback

    Traceback (most recent call last):
      File "/home/frank/qsettings/test.py", line 5, in <module>
        settings = QSettings(PATH, QSettings.IniFormat)
    AttributeError: type object 'QSettings' has no attribute 'IniFormat'
    

    Jo, was machen? Viel findet man nicht im Netz, also ausprobieren.

    from PyQt6.QtCore import QSettings
    
    # Objekt erzeugen
    settings = QSettings("Frank Mankel", "Restic UI")
    
    # Pfad ausgeben
    print("Settings file located at:", settings.fileName())
    
    # Test Variablen
    name = 'TEST'
    value = 100
    
    # Zwei Testwerte setzen
    settings.setValue(name, value)
    settings.setValue("editor/wrapMargin", 68)
    
    # Zwei Testwerte ausgeben
    print(settings.value('TEST'))
    print(settings.value('editor/wrapMargin'))
    

    Ausgabe

    (qsettings-kBmIZW-V) frank@frank-MS-7C37:~/qsettings$ /home/frank/.local/share/virtualenvs/qsettings-kBmIZW-V/bin/python /home/frank/qsettings/test.py
    Settings file located at: /home/frank/.config/Frank Mankel/Restic UI.conf
    100
    68
    

    Inhalt der Datei

    [General]
    TEST=100
    
    [editor]
    wrapMargin=68
    

    Fazit

    Problem gelöst, ich weiß jetzt wie es geht und kann mich jetzt dran setzen, das in meinem PyQt6 Projekt umzubauen, wenn ich mal Lust habe.... Das wird bestimmt nicht die letzte Hürde sein...

    Quellen

  • Falls das mal jemand braucht

    settings = QSettings(QSettings.Format(0),QSettings.Scope(0),"Frank_Mankel", "Restic_UI")
    
  • Möglichkeit 1

    Das hier

    settings = QSettings("Frank_Mankel", "Restic_UI")
    

    erzeugt unter

    /home/frank/.config/Frank_Mankel/Restic_UI.conf
    

    die Konfigurationsdatei.

    Möglichkeit 2

    Das hier

    settings = QSettings("Restic_UI")
    

    erzeugt unter

    /home/frank/.config/Restic_UI.conf
    

    die Konfigurationsdatei.

    Damit habe ich die grundlegenden Dinge, hoffentlich 😉 , verstanden.

    Für den Rest mal in die Dokumentation schauen.

    Sehr hilfreich war auch mal ein Blick auf die Definition der Klasse. Rechtsklick auf QSettings und dann Go to Definition

    class QSettings(QObject):
    
        class Scope(enum.Enum):
            UserScope = ... # type: QSettings.Scope
            SystemScope = ... # type: QSettings.Scope
    
        class Format(enum.Enum):
            NativeFormat = ... # type: QSettings.Format
            IniFormat = ... # type: QSettings.Format
            InvalidFormat = ... # type: QSettings.Format
    
        class Status(enum.Enum):
            NoError = ... # type: QSettings.Status
            AccessError = ... # type: QSettings.Status
            FormatError = ... # type: QSettings.Status
    [..gekürzt..]
    
  • FrankMF FrankM hat am auf dieses Thema verwiesen

  • Flask - Erste Schritte

    Allgemeine Diskussionen
    3
    0 Stimmen
    3 Beiträge
    208 Aufrufe
    FrankMF

    Mein vorhandenes Projekt war doch etwas größer als ich gedacht hatte. Also musste ich mehr Zeit aufwenden um es nach Flask zu transferieren. Nach einiger Zeit hatte sich eine ganz ansehnliche Zahl von Dateien angesammelt und es kam wie es kommen musste, ich wusste manchmal nicht mehr, welches File ich anfassen musste. Chaos kam auf 🙂

    So fing ich an ein wenig zu recherchieren und kam auf die Funktion Blueprint von Flask. Mich ein wenig eingelesen, ChatGPT mal eben um ein Beispiel gebeten und dann angefangen die Applikation entsprechend umzubauen.

    Auch das hat Zeit gekostet. Aber, jetzt habe ich ein aufgeräumtes Projekt, was es mir wesentlich einfacher macht, daran zu arbeiten.

    5226e90d-aa20-4b20-93af-e50f8f841880-grafik.png

    Wenn ihr also mal vorhabt, so was zu coden, halte ich es für sinnvoll das Projekt von Anfang an zu strukturieren. Und zum Schluss noch ein Screenshot zum Stand des Projektes.

    a7981ffc-0f93-41f4-93e2-c914fdba5e43-grafik.png

    Und weiter geht es, ist nämlich noch nicht fertig 😀

  • Redis - Datenbank Zugriff mit Python

    Redis
    3
    0 Stimmen
    3 Beiträge
    139 Aufrufe
    FrankMF

    Ich bin mit der Lernkurve noch nicht so richtig zufrieden. Eine Frage die sich mir stellte, geht das einfacher? Der Ursprung meiner Datenbank Struktur liegt in einem anderen Projekt, wo ich versucht habe Daten permanent in einem File zu speichern. Dazu hatte ich damals JSON genommen. Deswegen auch diese Zeilen

    self.project = str(db_client.json().get('settings', '$..project')[0]) or self.project

    Gut, ich hatte dann mal ChatGPT gefragt, wie macht man das so 'normalerweise'? es kam eine Klasse heraus, die ich dann intensiv ausprobiert habe, ein wenig umgebaut usw. So lange, bis ich der Meinung war, ok ich habe es verstanden. Jetzt nutzte der Code auch mehr Redis Funktionen, wie

    self.client.hset('settings', name, json.dumps(data))

    Es waren jetzt folgende Funktionen drin

    hset hexists hdel hget

    Dokumentation -> https://redis.io/commands/hset/

    Beim Durchlesen des Codes hatte ich jetzt mehr das Gefühl, so muss das sein 🙂

    In RedisInsight sieht das dann jetzt so aus.

    393195f7-1017-4285-8fca-734ee6b4bff7-grafik.png

    Klasse class PortfolioSettings: def __init__(self, host='172.17.0.2', port=6379, db=0): if args.test_mode == 1: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=TEST[0]) else: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=LIVE[0]) def set_settings(self, name, data): """Init settings if db don't exist""" if not self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def edit_setting(self, name, data): """Edit an entry in settings""" if self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def delete_setting(self, name): """Delete an entry in settings""" return self.client.hdel('settings', name) def get_setting(self, name): """Get an entry in settings""" setting = self.client.hget('settings', name) return json.loads(setting) if setting else None def get_all_settings(self): """Get all entries in settings""" settings = self.client.hgetall('settings') return {k.decode(): json.loads(v) for k, v in settings.items()}

    Und hier die Initialisierung

    settings_data = PortfolioSettings() ##################### # Will only be executed if DB is not available! ##################### if not settings_data.get_all_settings(): # Settings initialisieren print("INIT") settings_data.set_settings("project", "Portfolio") settings_data.set_settings("version", "0.0.3") settings_data.set_settings("theme", "dark") settings_data.set_settings("url_list", ["https://www.onvista.de/aktien/Deutsche-Telekom-Aktie-DE0005557508"]) settings_data.set_settings("exchange_list", ['DKB','Smartbroker','BUX'])

    Teile der Klasse sind [KI-generiert]

    Ich war zufrieden und habe die Klasse dann in mein Projekt übernommen und den Code überall entsprechend angepasst.

  • Pycharm - Umzug auf neuen Rechner

    Linux
    1
    0 Stimmen
    1 Beiträge
    76 Aufrufe
    Niemand hat geantwortet
  • NiceGUI

    Linux
    2
    0 Stimmen
    2 Beiträge
    310 Aufrufe
    FrankMF

    Ich habe mir das jetzt einige Tage gegeben und habe mich dagegen entschieden. Werde weiterhin PyWebIO benutzen. Hauptgrund ist die wesentlich bessere Dokumentation -> https://pywebio.readthedocs.io/en/latest/index.html

    Da kann ich mir auch mit meinem Python Kenntnisstand die Informationen holen, die ich brauche um es einzusetzen.

  • Example Class

    Angeheftet Python3
    3
    0 Stimmen
    3 Beiträge
    135 Aufrufe
    FrankMF

    In meinem PywebIO Projekt tauchte heute ein alter Bekannter auf. Wenn ich einen Eintrag (innerhalb der Liste) löschte, war das etwas durcheinander 🤔

    Ja, den Fehler kenne ich schon was länger und stolper immer mal wieder drüber. Heute z.B.

    Also mal grübeln 🤓

    Das mache ich, wenn ich einen Eintrag lösche

    case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Ich mache folgendes

    lösche den Eintrag speicher die Liste lade die Liste baue den Tab wieder auf

    Das führt aber dazu, das meine Liste die als Objekt im Speicher steht nicht aktuell ist. Im Gegenteil, da ist dann etwas Unordnung. Ich brauchte also die Möglichkeit mein Objekt backups irgendwie zurückzusetzen.

    Mal gegoogelt und die Dinge sind manchmal wirklich total easy 🙂

    # clear dict backups.clear()

    Das leert das Objekt und im nächsten Schritt kann ich es wieder befüllen.

    Lösung case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # clear dict backups.clear() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Problem erledigt. Damit ich das noch finde, wenn mein Kopf das nicht mehr hergibt, notiere ich das hier.

  • Python - Match-Case Statement

    Python3
    1
    0 Stimmen
    1 Beiträge
    108 Aufrufe
    Niemand hat geantwortet
  • Qt 5 Designer

    Python3
    1
    0 Stimmen
    1 Beiträge
    107 Aufrufe
    Niemand hat geantwortet
  • Restic UI - REST Server Unterstützung

    Restic UI
    2
    0 Stimmen
    2 Beiträge
    216 Aufrufe
    FrankMF

    Die REST Unterstützung ist komplett 🤓

    Link Preview Image Not Found

    favicon

    (gitlab.com)

    Ich denke, ein wenig Dokumentation wäre noch gut ☺