Ausgabe von Listenelementen

Fragen zu Tkinter.
Antworten
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Samstag 15. Dezember 2007, 22:07

Guten Tag die Herren,

Ich hab eine Oberfläche mit einer Listbox, welche leer ist.

Ich erstelle in einer Fachklasse eine Liste und auf der Oberfläche habe ich eine leere Listbox, in die ich alle Elemente aus der Liste inserten will.

Es wird aber immer nur das erste Element eingefügt.
Ich möchte aber, dass alle Elemente aus der Liste eingefügt werden, in dem Fall alle Namen der Tiere.

Beispiel(fügt nur ein Name in die Listbox ein):

Code: Alles auswählen

    def command(self):
        self.aktListe.Tiersuche(self.aktListe.holeElement())
        self.listbox.insert(END, self.aktListe.holeElement().holeName())		
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Samstag 15. Dezember 2007, 22:14

sorgenlos hat geschrieben:Guten Tag die Herren,
wir haben hier auch Damen...
Ich hab eine Oberfläche mit einer Listbox, welche leer ist.
In was für einem Toolkit wird diese Oberfläche programmiert?
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Samstag 15. Dezember 2007, 22:22

Mit Tkinter, hab ich vergessen hinzuzufügen...

Code: Alles auswählen

        self.listbox = Listbox(fenster, selectmode=EXTENDED, exportselection=0, borderwidth= '2', relief= 'groove')
        yscroll = Scrollbar(command=self.listbox.yview, orient=VERTICAL)
        yscroll.place(x=204, y=600, height=120)
        self.listbox.configure(yscrollcommand=yscroll.set)
        self.listbox.pack()
        self.listbox.place(x=3, y=600, width=200, height=120)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Samstag 15. Dezember 2007, 22:27

Zuersteinmal solltest du GUI-Spezifische Fragen in GUI-Spezifischen Teilen des Forums stellen und dann... ja das CodeBeispiel ist ziemlich nichtssagend.

Ersteinmal weiß niemand (außer dir evtl) was self.aktListe.Tiersuche ist, dann weiß niemand was self.aktListe.holeElement() zurueckgibt... und schon gar nicht will mir der Zusammenhang zwischen der ersten und der zweiten Zeile klar werden O_o !

Ich vermute aber (ah inzwischen erwaehntest du Tkinter, damit kenn ich mich leider nicht aus) das du jedes einzufuegende Element extra einfuegen musst, also quasi eine Schleife brauchst.

Edit: Und noch ein Tipp: Dein neues Codestueck bringt mich zwar nicht weiter, aber laesst vermuten, dass du nen Sternchen-Import (from Tkinter import * oder sowas) machst... das sollte man vermeiden ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Samstag 15. Dezember 2007, 22:41

self.aktListe.Tiersuche ist der Algorhytmus der die Liste mit den Tieren speichert.

self.aktListe.holeElement()
übergibt die referenz von einem Knoten der Liste.

Tatsache ist wenn ich das in einer Schleife mache, fügt er das letzte Element immer wieder ein bis die Anzahl erreicht wurde...

edit: ja ich benutze den berüchtigten sternimport, hatte aber bis jetzt keineprobleme
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Samstag 15. Dezember 2007, 22:59

Nochmal zum Sternchenimport:
http://www.python-forum.de/topic-12771, ... x&start=17
...also solltest du doch schon bescheid wissen ;)

sorgenlos hat geschrieben:Tatsache ist wenn ich das in einer Schleife mache, fügt er das letzte Element immer wieder ein bis die Anzahl erreicht wurde...
Hab mich mal eben schlau gemacht...also eine Schleife braucht man laut der Doku nicht, da man Listen uebergeben kann:

Code: Alles auswählen

>>> help(Tkinter.Listbox.insert)
Help on method insert in module Tkinter:

insert(self, index, *elements) unbound Tkinter.Listbox method
    Insert ELEMENTS at INDEX.
Dein Problem wird sein, dass END sich nicht aendert und somit immer die gleiche Position ueberschrieben wird. Du musst also immer den letzten Index herausfinden oder so... Tkinter ist irgendwie seltsam... wie bekomme ich denn die aktuelle Laenge der Liste heraus?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Samstag 15. Dezember 2007, 23:06

die aktuelle Länge bekommt man mit "len(listenname)"
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Samstag 15. Dezember 2007, 23:38

na die Funktion len() kenn ich... ich meine, wie ich die Anzahl der Elemente einer Tkinter.Listbox herausbekomme...!
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
runge
User
Beiträge: 8
Registriert: Sonntag 9. Dezember 2007, 12:10
Wohnort: Berlin

Sonntag 16. Dezember 2007, 00:21

Diese Möglichkeit sieht gut aus, aber ist mir aber unverständlich

Code: Alles auswählen

index(index) [#]

    Returns the numerical index (0 to size()-1) corresponding to the given index. This is typically ACTIVE, but can also be ANCHOR, or a string having the form “@x,y” where x and y are widget-relative pixel coordinates.

    index
        Index specifier.
    Returns:
        Numerical index. 
vielleicht kann jemand was draus machen, bzw du was damit anfangen.
BlackJack

Sonntag 16. Dezember 2007, 09:31

Falsche Methode, damit bekommt man den Index von einem Element, zum Beispiel dem gerade Aktiven, heraus.

Aber die Doku enthält einen Hinweis auf die Lösung: Dieser Index liegt zwischen 0 und ``size() - 1``. Jetzt ratet mal was die `size()`-Methode zurück gibt. :-)
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Sonntag 16. Dezember 2007, 13:18

So müsste es doch aussehen wenn ich mich nicht irre:

Code: Alles auswählen

    def Tier_suchen(self):
        self.aktListe.Tiersuche(self.aktListe.holeElement())
        for item in range(0, tierListe.size() - 1):
            self.listbox.insert(END, item)
Error:

Code: Alles auswählen

NameError: global name 'tierListe' is not defined
Wie die Liste erstellt wird:

Code: Alles auswählen

def tiersuche(self, knoten)
               tierListe.append([Tiername, prozent])
               tierListe_sortiert=sorted(TierListe, key=itemgetter(1))
BlackJack

Sonntag 16. Dezember 2007, 13:37

Das macht alles einen sehr verwirrenden, komplexen Eindruck. Es gibt `Tier_suchen`, `Tiersuche`, und `tiersuche`!? Aus der Gross-/Kleinschreibung kann man nicht erkennen was davon nun Klassen und was Funktionen/Methoden sind.

``self.aktListe.Tiersuche(self.aktListe.holeElement())`` sieht auch eigenartig aus. Kann `Tiersuche` sich das Element nicht selbst holen?

Die Fehlermeldung sollte eigentlich klar sein: `Tier_suchen` bekommt die `tierListe` weder übergeben, noch über das Objekt als Attribut. Das nächste Problem wäre dann das `size()` was es auf Listen nicht gibt. Das ist eine Methode von `Tkinter.Listbox`. Willst Du da überhaupt wissen wieviele Elemente in der `Listbox` sind? Um Elemente aus einer Liste in eine `Listbox` einzufügen braucht man die Länge gar nicht wissen; man fügt einfach jedes Element ein.

Code: Alles auswählen

import Tkinter as tk

def main():
    liste = ['foo', 'bar', 'baz']
    root = tk.Tk()
    listbox = tk.Listbox(root)
    listbox.pack()
    for element in liste:
        listbox.insert(tk.END, element)
    root.mainloop()
Antworten