textwidget mit IDs?

Fragen zu Tkinter.
Antworten
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

Hallo mal wieder! :)


Ich habe ein Fenster in welchem sich viele Textfelder in folgendem format befinden (Beispiel):

Code: Alles auswählen

        FRAMElist = tk.Text(self,width=20, height=1, bg='white')
        FRAMElist.grid(row=indexa,column=3)
        FRAMElist.insert('0.0',framecount)
ich habe verscheidene Elemente, welche im Verlauf meines Programmablaufs immer wieder auftreten (Messungen), und ich möchte halt darstellen, wie oft diese auftreten. Da ich nun aber eben viele Elemente mit je mehreren Textfeldern habe, also auch Name etc, wüsste ich gerne, ob ich jedes Textfeld mit sowas wie einer ID versehen kann, auf die ich einfach zugreifen kann

pseudocode:
EDIT textwidget where ID = frames



sowas in der Art eben. Bei den Messungen schaue ich, ob der Kandidat schonmal auftrat (durch eindeutig zuordenbare Werte, die ich in einer liste stehen habe), und sollte er bereits in meiner Tabelle (in meinem Fenster) drinstehen würde ich halt nur gerne seinen Zählwert erhöhen. Wie ich das machen würde weiß ich schon, nur steh ich vor dem Problem, dass ich nicht weiß, auf welche Weise ich den richtigen Eintrag erwischen kann

Wüsstet ihr evtl, ob und wie das geht? Gibt es, sollte das nicht funktionieren, evtl Alternativlösungen die ihr mir vorschlagen könntet?


Vielen Dank für eure Zeit im Vorraus,

Gruß, mops
BlackJack

@Trollmops: Du kannst die Widgets doch einfach in eine passende Datenstruktur stecken, also zum Beispiel ein Wörterbuch was die ID für den Wert auf das Widget-Objekt abbildet oder auf eine Liste mit solchen Objekten, wenn es mehr als eines für eine ID gibt.
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

würde ich dann mal versuchen. nur wie genau soll ich das anstellen? (hast du ein beispiel?)

ich mach grad erst noch was anderes und wenn ich damit durch bin widme ich mich wieder dem o.g. problem :)

danke trotzdem
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Trollmops hat geschrieben:würde ich dann mal versuchen. nur wie genau soll ich das anstellen? (hast du ein beispiel?)
Äh... wenn Du nicht weisst, was ein Dictionary ist, dann bist Du bei GUI-Programmierung falsch :P Das ist doch Grundlagenwissen!

Beispiel:

Code: Alles auswählen

frames = {
    "coole_unqiue_id": tk.Text(self,width=20, height=1, bg='white'),
    "noch_ne_id": tk.Text(self,width=20, height=1, bg='white'),
    ...
}

# Zugriff
frames["coole_unique_id"] # -> Text-Widget als Rückgabewert
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

ich bin bei gui-programmierung nicht falsch, sondern neu, aber ich weiß jetzt was ihr meint ^^

ja, damit könnts klappen, mache mich da die nächsten tage ran und sag dann wies sich entwickelt hat, also danke.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Trollmops hat geschrieben:ich bin bei gui-programmierung nicht falsch, sondern neu, ...
Ich sagte ja auch: "Wenn Du nicht weisst, was ein Dictionary ist..." ;-) Und dann wärst Du nämlich auch bei Python oder ggf.der Programmierung i.A. neu und damit in der Tat "falsch" bei der GUI-Programmierung!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

ich habe das jetzt mit einer liste in einer liste gelöst, die "sublist" habe ich mit meinen textwidgets gefüllt (ich wollte später ja auch das in column=3 zugreifen), und wenn die zeile fertig war habe ich sie einfach in eine hauptliste eingefügt, deren index der entsprechenden zeile meiner tabelle entsprach.

einzelne textwidgets kann ich jetzt mit

hauptliste[x][y] ansprechen, wobei x der hauptlistenindex und damit auch zeilen index ist, und y der sublistindex, also spaltenindex ist.
den zeilenindex x habe ich per dictionaryeintrag an eine einmalige eigenschaft gekoppelt, sodass ich bei wiederholtem auftreten eines Ereignisses immer weiß in welcher zeile ich dieses notiert habe. der spaltenindex y entspricht ja den entsprechenden eigenschaften (z.b. erste spalte=name, zweite spalte=attribut#1, dritte spalte=auftrittshäufigkeit), und ich kann z.b. gezielt die auftrittshäufigkeit ändern, indem ich auf spalte y=2 zugreife

Code: Alles auswählen

sublist=[] #kommt nur innerhalb dieser funktion vor
first=tk.Text(self,width=20)
first.grid(row=rowindex,column=0)
first,insert('0.0',"nun kann")
sublist.append(first)
second=tk.Text(self,width=20)
second.grid(row=rowindex,column=1)
second.insert('0.0',"ich schoen")
sublist.append(second)
third=tk.Text(self,width=20)
third.grid(row=rowindex,column=2)
third.insert('0.0',"drauf zugreifen")
sublist.append(third)
finallist.append(sublist) #finallist ist global und enthält dann alle einträge)

das ist jetzt mal die ausführliche und ungeloppte griderstellung, damit ihr wisst was ich da nun gemacht habe.



gruß, mops
Zuletzt geändert von Hyperion am Samstag 16. Juni 2012, 14:24, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Block gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du solltest niemals syntaktisch falschen Code posten ;-)
Trollmops hat geschrieben: den zeilenindex x habe ich per dictionaryeintrag an eine einmalige eigenschaft gekoppelt, sodass ich bei wiederholtem auftreten eines Ereignisses immer weiß in welcher zeile ich dieses notiert habe.
Das kapiere ich nicht! Da wäre ein Beispiel schön; sofern Du für jedes Element einen Dictionary-Eintrag hast, brauchst Du nämlich kein Dictionary.

Code: Alles auswählen

finallist.append(sublist) #finallist ist global und enthält dann alle einträge)
"Global" riecht nach einem Code-Smell... ich hoffe Du meinst nicht wirklich ``global`` oder nutzt das Objekt tatsächlich auf Modulebene?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten