Dictionary um Eintrag erweitern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hi
ich möchte mein dict nach button-click jeweils um den nächsten zusätzlichen eintrag erweitern.
mein dict:

Code: Alles auswählen

{'1.Stufe ': [1, 'edit_3.ico'], '2.Stufe ': [2, 'edit_3.ico'], '3.Stufe ': [3, 'edit_3.ico'], '4.Stufe ': [4, 'edit_3.ico'], '5.Stufe ': [5, 'edit_3.ico'], '6.Stufe ': [6, 'edit_3.ico'], 'Position ': [7, 'edit_3.ico'], 'Unterposition ': [8, 'edit_3.ico']}
nach click ist der nächste eintrag:

Code: Alles auswählen

7.Stufe  [6, 'edit_3.ico']
neues dict soll dann sein:

Code: Alles auswählen

{'1.Stufe ': [1, 'edit_3.ico'], '2.Stufe ': [2, 'edit_3.ico'], '3.Stufe ': [3, 'edit_3.ico'], '4.Stufe ': [4, 'edit_3.ico'], '5.Stufe ': [5, 'edit_3.ico'], '6.Stufe ': [6, 'edit_3.ico'], '7.Stufe ': [7, 'edit_3.ico'], 'Position ': [7, 'edit_3.ico'], 'Unterposition ': [8, 'edit_3.ico']}
dann:

Code: Alles auswählen

8.Stufe  [7, 'edit_3.ico']
neues dict ist dann:

Code: Alles auswählen

{'1.Stufe ': [1, 'edit_3.ico'], '2.Stufe ': [2, 'edit_3.ico'], '3.Stufe ': [3, 'edit_3.ico'], '4.Stufe ': [4, 'edit_3.ico'], '5.Stufe ': [5, 'edit_3.ico'], '6.Stufe ': [6, 'edit_3.ico'], '7.Stufe ': [7, 'edit_3.ico'], '8.Stufe ': [8, 'edit_3.ico'],  'Position ': [7, 'edit_3.ico'], 'Unterposition ': [8, 'edit_3.ico']}
usw.
ich bekomme es immer nur hin vor 'Position ' den nächsten jeweils zu ersetzen, aber nicht zu erweitern. :(
jmd ne idee?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Stufen hast, die einfach durchnummeriert werden, dann ist ein Wörterbuch die falsche Datenstruktur. Benutze eine Liste.
Die Werte scheinen sehr redundant. Wenn das wirklich der Fall ist, dann reicht eine Zahl (die Anzahl der Stufen) und Du brauchst gar keine Datenstruktur.

Was wird denn mit dem Wörterbuch gemacht?
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Mit einer Liste mache ich es zur Zeit, aus der ich dann immer ein Dict erstelle.
Das Dict benutze ich um eine Reihe von Buttons mit Image in einem Frame anzuzeigen.
Bei jedem Click wird an der bestimmten Stelle ein Button zugefügt (oder wieder entfernt).
Das Dict eben einfach deshalb, weil ich jedem Button sein eigenes Image verpassen kann (wenn ich will).

Ich dachte, aus einer Liste heraus jedesmal ein entsprechendes Dict zu erstellen, ist eher "dreckig"?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, das ist der saubere Weg, weil das Dict nur temporär in einem kleinen überschaubaren Codestück existiert.
So ganz habe ich aber den Sinn des Wörterbuchs noch nicht verstanden. Code sagt mehr als tausend Worte.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

so wollte ich es haben:

Code: Alles auswählen

import os
import sys
import tkinter as tk
from PIL import Image, ImageTk
from collections import OrderedDict

root = tk.Tk()
image_folder = os.path.join(os.getcwd(), "images")

btn_list = [['1.Stufe ', 'edit_3.ico'],
            ['2.Stufe ', 'edit_3.ico'],
            ['3.Stufe ', 'edit_3.ico'],
            ['4.Stufe ', 'edit_3.ico'],
            ['5.Stufe ', 'edit_3.ico'],
            ['6.Stufe ', 'edit_3.ico'],
            ['Position ', 'edit_3.ico']
            ]

btn_dict = {}

dict_cnt = tk.IntVar()
dict_cnt.set(6)


def create_btn_dict():
    btn_dict.clear()
    for btn_idx, btn_element in enumerate(btn_list):
        btn_key = btn_element[0]
        btn_image = btn_element[1]
        btn_value = [btn_idx, btn_image]
        btn_dict[btn_key] = btn_value
    print(btn_dict)
    print('---')


def add_step():
    if not dict_cnt.get() is 14:
        btn_list.insert(dict_cnt.get(), [str(dict_cnt.get()+1)+'.Stufe ', 'edit_3.ico'])
        dict_cnt.set(dict_cnt.get()+1)
        create_btn_dict()


def remove_step():
    if not dict_cnt.get() is 6:
        btn_list.pop(dict_cnt.get()-1)
        dict_cnt.set(dict_cnt.get()-1)
        create_btn_dict()


typ_main = tk.Frame(root, bg='lightgrey')
typ_main.pack(side=tk.TOP, fill=tk.X, expand=True, padx=2, pady=2)

typ_arrows = tk.Frame(typ_main, bg='lightgrey')
typ_arrows.pack(side=tk.LEFT, fill=tk.X, expand=False)

up_arrow = tk.Button(typ_arrows,
                     text='+',
                     font=('Arial', 7),
                     width=6,
                     bg='white',
                     relief=tk.GROOVE,
                     command=add_step)
up_arrow.pack(side=tk.LEFT, fill=tk.X, expand=False, padx=4)

down_arrow = tk.Button(typ_arrows,
                       text='-',
                       font=('Arial', 7),
                       width=6,
                       bg='white',
                       relief=tk.GROOVE,
                       command=remove_step)
down_arrow.pack(side=tk.RIGHT, fill=tk.X, expand=False)
create_btn_dict()
root.mainloop()
wenn man möchte, kann man jetzt jedem button sein eigenes image verpassen, in dem man die jeweilige button_zahl einfach als image_namen setzt.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zahlenvergleiche mit ``is`` ist falsch. Das ist Zufall dass das in CPython mit kleinen Zahlen funktioniert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OS: es ist meist nicht gewollt, dass ein image-Verzeichnis relativ zum aktuellen Arbeitsverzeichnis liegt. Da sich dieses auch nicht ändern sollte, braucht man es auch nicht absolut angeben. Falls doch, benutzt man os.path.abspath
Keine globalen Variablen benutzen! Ein dict.clear ist eigentlich fast nie sinnvoll.
Wie schon geschrieben, sollte man das Wörterbuch temporär erstellen, wenn es gebraucht wird, nicht präventiv bei jeder Änderung Deiner btn_list.
Benutze keine Abkürzungen, button kann man ohne Probleme ausschreiben.

Das Beispiel ist unsinnig, da das, was gebraucht wird, gar nicht benutzt wird. btn_dict kann ersatzlos gestrichen werden. btn_list wird auch nicht gebraucht. Ein Beispiel-Code sollte schon das zeigen, was gefragt ist.

Ich sehe eine einfache Liste, ohne redundante Positionsinformation, und ein einzelnen Bild für diesen Positions-Knopf:

Code: Alles auswählen

import os
import tkinter as tk
from functools import partial

IMAGE_FOLDER = os.path.abspath("images")
DEFAULT_ICON = 'edit_3.ico'

def add_step(stufen_images):
    if len(stufen_images) < 14:
        stufen_images.append(DEFAULT_ICON)

def remove_step(stufen_images):
    if len(stufen_images) > 6:
        del stufen_images[-1]

def main():
    stufen_images = [DEFAULT_ICON] * 6
    position_image = DEFAULT_ICON

    root = tk.Tk()
    typ_main = tk.Frame(root, bg='lightgrey')
    typ_main.pack(side=tk.TOP, fill=tk.X, expand=True, padx=2, pady=2)

    typ_arrows = tk.Frame(typ_main, bg='lightgrey')
    typ_arrows.pack(side=tk.LEFT, fill=tk.X, expand=False)

    up_arrow = tk.Button(typ_arrows,
                        text='+',
                        font=('Arial', 7),
                        width=6,
                        bg='white',
                        relief=tk.GROOVE,
                        command=partial(add_step, stufen_images))
    up_arrow.pack(side=tk.LEFT, fill=tk.X, expand=False, padx=4)

    down_arrow = tk.Button(typ_arrows,
                        text='-',
                        font=('Arial', 7),
                        width=6,
                        bg='white',
                        relief=tk.GROOVE,
                        command=partial(remove_step, stufen_images))
    down_arrow.pack(side=tk.RIGHT, fill=tk.X, expand=False)
    root.mainloop()

if __name__ == '__main__':
    main()
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Dankeschön für die Teilnahme.
Aber ich brauche ein dict indem die keys die button-namen sind und die values [nummer, images] sind-.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Aber warum? Kannst Du das anhand eines Code-Beispiels illustrieren?
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Das soll so aussehen:
Bild
und immer durch '+' und '-' soll der nächste button mit image hinzu gefügt oder entfernt werden.ö
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, und wo brauchst Du jetzt das Wörterbuch?
Wie hast Du denn das Bild erzeugt? Code?
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Das Wörterbuch nehm ich für die Darstellung recht des Buttons "Datenbeziehung".
Key = Datentyp, Values = 1.Stufe, ...., Unterposition
Key = Datenbereich, Values = Zelle, Zeile, Spalte
Key = Datenformat, Values = Schrift, Hintergrund, Formel
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast also eine deutlich komplexere Struktur, als Du bisher dargestellt hast? Bleibt trotzdem die Frage, warum das Wörterbücher sind.
Und was hinter den Knöpfen steckt. Machen die wirklich alle das selbe? Wenn nicht, würde man ja eine Ebene höher ansetzen und hätte drei Klassen, für Datentyp, Datenbereich und Datenformat.
Aber wie immer, ohne den Code zu kennen, der wirklich alle Aspekte des Problems zeigt, bleibt das halt ein Stochern im Nebel.
Antworten