Verwaltung von mehreren Labels

Fragen zu Tkinter.
Antworten
Hobbit
User
Beiträge: 7
Registriert: Donnerstag 28. November 2013, 19:47

Hallo Community,

Ich schreibe gerade an einer kleine Oberfläche für mein Serverprogramm, welches Informationen über Clients anzeigen soll, sobald sie verbunden sind. Leider funktioniert das nicht und erhoffe mit Hilfe.
Die Oberfläche besitzt eine Liste zum verwalten der verschiedenen Labels und eine Funktion new_connection(), welche aufgerufen wird, sobald ein neuer Client sich verbindet.

Die class der Oberfläche:

Code: Alles auswählen

class Gui(object):

    def __init__(self):
        self.root = Tkinter.Tk()
        self.root.title("Server Interface")
        self.root.geometry("640x480")
        self.labels = []

    def run(self):
        self.header()
        self.show()
        self.root.mainloop()

    def new_connection(self, client_ip):
        self.labels.insert(len(self.labels)+1, client_ip)

    def show(self):
        for i in self.labels:
            objects = Tkinter.Label(self.root, text=i)
            objects.grid()
class- Aufruf bei neuem Client:

Code: Alles auswählen

                
 new_con = Gui()
  new_con.new_connection(addr[0])
class Aufruf zum Start des Servers(in eigenem Thread) und Oberfläche

Code: Alles auswählen

server = Server()
server.start()
gui = Gui()
gui.run()
Obwohl der Server einen neuen Client ohne Probleme annimmt bleibt die Oberfläche leer.
Wo liegt mein Fehler ?

Danke schonmal im Vorraus!

Mfg Hobbit
BlackJack

@Hobbit: Als erstes magst Du das `insert()` bitte mal durch ein `append()` ersetzen. Das ist ja nicht mit anzuschauen. :P

Der Fehler liegt darin das Du nirgends das Label erzeugst. Die `show()`-Methode wird einmal aufgerufen. Da ist die Liste noch lehr, also werden keine Label erzeugt. Und nur weil Du etwas zu der Liste hinzufügst werden ja nicht auf magische Weise irgendwelche Methoden in Deiner GUI aufgerufen. `show()` wäre auch falsch, denn Du willst ja nur das neu hinzugekommene Label erzeugen und anzeigen.

Bei `i` als Laufvariable einer Schleife würden übrigens 99% der Programmierer erwarten das `i` an ganze Zahlen gebunden wird. Vergib da mal besser einen vernünftigen, aussagekräftigen Namen.

Eine Liste ist vielleicht auch die falsche Datenstruktur, denn irgendwann möchte man Label vielleicht auch wieder löschen, wenn der Client nicht mehr da ist. Und da wird als Kennzeichnung wahrscheinlich auch wieder die IP verwendet, also bietet sich eine Abbildung von IPs auf Label an.
Hobbit
User
Beiträge: 7
Registriert: Donnerstag 28. November 2013, 19:47

Hallo BlackJack,

Die Schönheitsfehler sind korrigiert, danke für die Hinweise ;)

Wie genau meinst du das mit "show" Methode wird nur einmal aufgerufen ? Muss man die run Methode in eine Schleife stecken damit sie jedesmal checkt ob ein neuer Wert der Liste hinzugefügt wurde?

Code: Alles auswählen

While True:
    gui.run()
behebt das Problem leider nicht.

Meinst du mit "Abbildung von IPs auf Labels" eine eigene class zu schreiben?

Mfg Hobbit
Sirius3
User
Beiträge: 18294
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hobbit: Du rufst »show« in »run« auf, das einmal aufgerufen wird, also wird auch »show« nur einmal aufgerufen. Jetzt »run« in eine Schleife zu stecken, ist nur unsinniges Herumraten. So funktioniert aber programmieren nicht. Du mußt Dich fragen, was soll passieren wenn ein neuer Client sich anmeldet? Mit "Abbildung" ist hier ein »dict« gemeint.
Antworten