Listbox aktualisieren

Fragen zu Tkinter.
Antworten
mopmopen
User
Beiträge: 8
Registriert: Mittwoch 7. November 2012, 18:21

Guten Tag!

Ich habe zur Zeit ein kleines Problem in meiner ersten wirklichen GUI-Entwicklung für ein Shell-Programm von mir.
Zusammengefasst soll mein Programm am Ende eine 'Liste' darstellen mit dem kompletten Inhalt des Ordners und bei Bedarf sollen die Bilder und PDF-Dateien auch geöffnet werden können.

Das Problem ist, dass sozusagen im Hintergrund der GUI ein eigen geschriebenes Programm läuft, welches die ganze Zeit Daten herunterlädt (Thema 'Threading' wahrscheinlich) und in dem bestimmten Ordner abspeichert.
Ich stelle mir gerade die Frage, wie ich mit Hilfe von Tkinter es erstmal so hinbekommen kann, das meine Listbox die ich generiert habe, auch jedesmal ein 'Update' bekommt, so dass der neue Inhalt auch in die Listbox rein kommt.

Ich hänge schon einmal mein Quellcode hier an, um schon einmal zu zeigen, dass das rudimentäre um die Listbox herum läuft.
Für Anregungen bzgl. des Problems oder allg. Code-Verbesserung bin ich jederzeit offen.

Mit freundlichen Gruß
mopmopen

Code: Alles auswählen

from tkinter.ttk import Button, Style
from tkinter.filedialog import askdirectory
from tkinter import Frame, Tk, BOTH, Listbox, END, SINGLE, RIGHT, Y, BOTTOM
from os import listdir

__author__ = 'mopmopen'
__version__ = 0.1

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent, background="black")
        self.parent = parent
        self.quitButton = Button(self, text="Quit!", command=self.quit)
        self.listbox = Listbox(self, selectmode=SINGLE,bg = "black",fg='green')
        self.current = ()
        self.current_directory = askdirectory()
        self.initUI()


    def initUI(self):
        self.parent.title("ICQ-Crawler")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=1)


        self.quitButton.pack(side=BOTTOM)
        self.listbox.pack(side=RIGHT, fill=Y)
        self.directory_content = listdir(self.current_directory)
        
        for item in enumerate(self.directory_content):
            self.listbox.insert(END, item)
        self.poll()


    def poll(self):
        now = self.listbox.curselection()
        if now != self.current:
            self.list_has_changed(now)
            self.current = now
        self.after(250, self.poll)

    def list_has_changed(self, selection):
        print(selection[0])


def main():
    root = Tk()
    root.geometry("500x500")
    app = Example(root)
    root.mainloop()


if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo mopmopen,

da die GUI nur vom Haupt-Thread aus geändert werden darf, bieten sich die üblichen
Interprozess-Komunikations-Techniken an, sprich Queue.

Grüße
Sirius
mopmopen
User
Beiträge: 8
Registriert: Mittwoch 7. November 2012, 18:21

Danke schon einmal für die Antwort.
Wie sieht denn so ein Konstrukt in meinem Beispiel aus?

Das mit der ListBox-Aktualisierung habe ich zumindest schon einmal gelöst, indem ich es einfach über einen manuellen Button geregelt habe,
sowie kann ich schon einmal Bilder in ein Label schreiben.

Ausstehend ist nun noch den 'Downloader' im Hintergrund und eine Möglichkeit für einen PDF-Viewer.
Antworten