Seite 1 von 1
Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 08:36
von DMD-OS
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:
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:
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?
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 08:56
von Sirius3
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?
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 09:26
von DMD-OS
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"?
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 09:30
von Sirius3
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.
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 10:17
von DMD-OS
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.
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 10:29
von __blackjack__
Zahlenvergleiche mit ``is`` ist falsch. Das ist Zufall dass das in CPython mit kleinen Zahlen funktioniert.
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 10:37
von Sirius3
@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()
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 11:10
von DMD-OS
Dankeschön für die Teilnahme.
Aber ich brauche ein dict indem die keys die button-namen sind und die values [nummer, images] sind-.
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 11:19
von Sirius3
Aber warum? Kannst Du das anhand eines Code-Beispiels illustrieren?
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 11:36
von DMD-OS
Das soll so aussehen:

und immer durch '+' und '-' soll der nächste button mit image hinzu gefügt oder entfernt werden.ö
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 11:47
von Sirius3
Ja, und wo brauchst Du jetzt das Wörterbuch?
Wie hast Du denn das Bild erzeugt? Code?
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 16:31
von DMD-OS
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
Re: Dictionary um Eintrag erweitern
Verfasst: Montag 16. März 2020, 16:43
von Sirius3
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.