Listboxen

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was müsste mit "<<ListboxSelect>>" funktionieren? Was hättest Du denn bei der Ausgabe von ``print("<<ListboxSelect>>", Detail)`` anderes erwartet als da tatsächlich ausgegeben wurde? Das gibt den Text <<ListboxSelect>> aus und eine Zeichenkettendarstellung der Funktion `Detail`.

Was soll denn die GUI überhaupt machen? Also was steht in diesen Listboxen zur Auswahl und warum?

Natürlich kann man auf dem Raspi auch andere GUI-Rahmenwerke als Tk verwenden. Das ist letztendlich ja ein ganz normales Linux mit grafischer Oberfläche. Man kann also beispielsweise auch GUIs mit Gtk oder Qt schreiben.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

import tkinter as tk
import functools


def mein_toller_callback(a, b, c, d, e, f):
    print(a, b, c, d, e, f)


def main():
    root =tk.Tk()
    button = tk.Button(
        root,
        text="Drueck mich feste",
        command=functools.partial(
            mein_toller_callback,
            "mit",
            "einer",
            "unglaublichen",
            "anzahl",
            "an",
            "argumenten",
        )
    )
    button.pack()
    root.mainloop()

if __name__ == '__main__':
    main()
So einfach benutzt man functools.partial.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Hi _deets_ , danke für die Mühe mir zu helfen.
Jetzt zeig mir doch bitte wie ich konkret die, ich sag mal Referenz, jede Listbox auch mit gleichen Namen hat eine eigene " .67967184" die ich beim erstellen auch auslesen kann. Und diese Referenz verflixt nochmal, sollte doch beim ".bind<<ListboxSelect>>" irgendwie zu gebrauchen sein. :lol: Ein Bierchen steht.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@mosimfs: dass Tkinter da Nummern vergibt, ist ein internes Implementierungsdetail. In Python gibt es Objekte, die die Listboxen repräsentieren, und die benutzt man auch.

Für Dein konkretes Beispiel:

Code: Alles auswählen

def details(listbox, event):
    print(listbox.selection_get())


[...]
listbox = create_listbox(window, number, "Text")
listbox.bind("<<ListboxSelect>>", functools.partial(details, listbox))
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Danke Sirius3, somit lassen sich auch mehrere Parameter übergeben.
zB. auch bei, "window.bind("<KeyPress-M>", Maileingang, ***)" prima so lässt sich einiges vereinfachen.
Dennoch, "????.bind" steht noch in den Sternen.
lg
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@mosimfs: ich verstehe nicht, was Du mit Sternen und Fragezeichen meinst. Kannst Du konkret das Problem beschreiben, das Du jetzt noch hast? Mit genug Kontext, was denn Dein Ziel ist, um es zu verstehen, und nicht so, wie Du denkst, dass es als Code umzusetzen wäre.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Hi, damit ".bind" aufgeführt wird braucht es ein Objekt, in meinem Fall halt den Listpox Namen. Der, durch die For-schleife immer gleich ist und dadurch immer die letzte die abrufbare ist. Wie im Vorfeld schon beschrieben reagieren ja alle auf anklicken, nur bekomme ich keinen Listbox Nahmen. Sorry meine Syntaxbezeichnen sind alles andere als . . .
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mosimfs: Du musst halt die `bind()`-Methode aufrufen wenn Du das jeweilige `Listbox`-Objekt an den/einen Namen gebunden hast. Falls das aus irgendwelchen Gründen an der Stelle nicht geht oder nicht passieren soll (warum?), dann musst Du Dir die Objekte beispielsweise in einer Liste merken und dann wenn Du die `bind()`-Methode aufrufen willst eine Schleife über diese Liste schreiben und `bind()` auf jedem `Listbox`-Objekt aufrufen.

Ob es vielleicht auch aus anderen Gründen Sinn machen könnte die `Listbox`\en in einer Liste zu sammeln, kann ich nicht sagen, weil ich immer noch nicht verstanden habe welches grundsätzliche Problem das ganze eigentlich lösen soll. Du beschreibst hier ja immer nur das was Du für eine Lösung hältst, nie was da eigentlich gelöst werden soll.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Hallo :geek: (Durchblicker),
Jetzt funktioniert's ! Dein letzter Beitrag, da ist bei mir der Groschen gefallen.

Code: Alles auswählen

   
    try:
        f = open(SO+datei, "r")
        x=0
        for Text in f:
            Text = Text.split(" | ")
            Text = Text[0][0:2] + ". " + Text[0][12:17] + " " + Text[1] + "               "
            Text = Text[0:39]
            x+=1
            if a==0:
                Daten(x, Text) # Listbox erzeugen
                z = x
        if m == 1:
            Daten(z, Text)
        f.close()
        Eingang.config(text= Y+"-Eingänge ", bg="#fff")
    except IOError:
        Eingang.config(text= " keine Daten vorhanden ", bg="#fff")
        z=0
        
#----------------------------------------------------------------------------
        
def Daten(z, MEtext):
    Anzeige = {}
    Anzeige[z]=Listbox(master=Startfenster, height=1, width=35, bd=2, font=("Courier", 13), relief=RAISED)
    Anzeige[z].insert(END, MEtext)
    if z <= 26:
        Anzeige[z].grid(column=0, row=z, columnspan=5, pady=3, padx=3, sticky=W)
    elif z > 26 and z <= 52:
        Anzeige[z].grid(column=5, row=z-26, columnspan=11, pady=3, padx=3, sticky=W)        
    elif z > 52 and z <= 78:
        Anzeige[z].grid(column=11, row=z-52, columnspan=16, pady=3, padx=3, sticky=W)        
    elif z > 78 and z <= 104:
        Anzeige[z].grid(column=17, row=z-78, columnspan=20, pady=3, padx=3, sticky=W)
        
    Anzeige[z].bind("<<ListboxSelect>>", Detail) # Eintrag abfragen

#----------------------------------------------------------------------------
        
def Detail(event):
    event.widget.unbind("<<ListboxSelect>>")
    name = event.widget.get (int(event.widget.curselection()[0]))
    Seitelöschen()
    Knipserseite(name)

>>> ================================ RESTART ================================
>>>
Programm gestartet am: 05.07.2019
Neuer Ordner wird bei Jahreswechsel angelegt!

27. 11:16 06_Moser_Franz_huckepack.jpg

dieser Eintrag kommt aus einer der Listboxen :wink:
und der wird den weiteren Verlauf ermöglichen.

Werte Hilfesteller:
Weil ich gerade den Beitrag von @wurschtbrot, "Variablen mit for Schleife erzeugen" gelesen hab.
Seine letzten Beiträge könnten meine sein, in den jungen Jahren hab ich mich mit Basic auch Visual Basic und Lisp(ACAD) auseinander gesetzt.
Nach langen jetzt, juckt mich der Raspi wieder. Von Grund auf den Syntax von Python zu lernen, ich bin kein Student. Ich will eine Idee verwirklichen.
vielen Dank Euch.

Übrigens, eine Frage zu *.eml Dateianhang auslesen von Mail's. Wo platziert man das im Forum am gescheitesten.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist der Sinn des Wörterbuchs in `Daten`?
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das mit `z` und den ganzen ``if``/``elif``-Zweigen ist auch übermässig kompliziert. Spalte und Zeile sollten sich aus `z` einfach berechnen lassen. Die `columnspan`-Werte machen keinen Sinn so unregelmässig wie die sind. Das sieht so aus, als wäre da zu viel in *einem* Grid angeordnet, statt die GUI-Bereiche in eigene Container zu stecken.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

und gleich nochmal:
Damit der Text dessen Länge ja variiert, in der Listbox dessen Breite vorgegeben ist linksbündig angezeigt wird formatiere ich so.
Text = Text[0][0:2] + ". " + Text[0][12:17] + " " + Text[1] + " "
Text = Text[0:39] was der Lostbox Breite entspricht, wobei hier je nach Länge leider auch ein Teil abgezwickt wird.
Wie macht's der Profi ?

Ps: Hab deine Beiträge erst jetzt gesehen. Du wirst das Foto der Startseite noch nicht angeschaut haben.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mosimfs: Der Profi schreibt Namen die nicht für Konstanten oder Klassen stehen klein_mit_unterstrichen, vermeidet ”magische” Indexzahlen wenn man die Elemente an sprechendere Namen binden kann, und Zeichenkettenformatierung statt zusammenstückeln mit ``+``. Die `Listbox`-Breite wird im Code mit 35 angegeben und nicht mit 38. Ich sehe auch nicht so ganz warum man den Text rechts mit Leerzeichen auffüllen sollte.

Ausserdem verwendet der Profi für alles aussagekräftige Namen, hat keine globalen Variablen im Programm, keine komischen Trennlinienkommentare, benennt Funktionen und Methoden nach den Tätigkeiten die sie ausführen, verwendet bei GUIs objektorientierte Programmierung, …

Falls mit „Du“ ich gemeint war – ich habe mir das Bild von der GUI angesehen. Warum? Falls Du denkst das beantwortet meine Frage danach was mit dieser GUI eigentlich gemacht werden soll und welches Problem diese Listboxen lösen sollen: Ich habe keine Ahnung was Du damit machen/erreichen willst.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Hallo, der ProgrammCode ist ja für mich und ob ich A, a, oder _ verwende macht doch für die Fragen keinen Unterschied. Die Abweichung 35 zu 38 braucht's, da sonst bei "grid" der Text sofern er länger ist auch vorne abgezwickt wird. Eine Lösung ist gefragt, nicht ein schöner Code.
lg und nicht persönlich nehmen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schlecht lesbarer Code, konfuse bis nicht existente Problembeschreibung -> geringe bis nicht vorhandene Motivation sich damit auseinander zu setzen 🤷🏼‍♂️
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mosimfs: A, a, oder _ macht für die Frage keinen Unterschied, aber für diejenigen die versuchen wollen zu Antworten. Die müssen nämlich verstehen was da gemacht wird, und das ist nun mal einfacher wenn das da verständlich steht und nicht wenn es unverständlich dasteht. ”Schöner” Code *ist* die Lösung für viele Probleme. Das ”schön” ist ja keine Frage von das es irgendwie ”hübsch” aussieht, sondern das es sauber, verständlich, nachvollziehbar ausgedrückt ist. Das verhindert Fehler. Gute Namensgebung ist nichts was man vielleicht irgendwann einmal später macht, wenn alles läuft, sondern das ist wichtig und sollte von Anfang eine wichtige Rolle spielen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
mosimfs
User
Beiträge: 28
Registriert: Sonntag 30. Juni 2019, 13:07

Danke, für die Lösung der letzten Frage.
Antworten