Du nutzt Sockets falsch. Zum ersten sollte keine Variable aus einem Buchstaben bestehen und `s` ist zudem noch global. TCP-Sockets sind Streams, das heißt, ein recv(8) kann alles zwischen einem und acht Bytes zurückliefern. Du mußt also so lange lesen, bis Du tatsächlich 8 Bytes zusammenhast.
Die Variable recv_function ist überflüssig, Du kannst diese zwei Zeilen zu einer zusammenfassen. Die if-Kaskade enthält identischen Code. Benutze ein Wörterbuch, das die Zahlen auf die Namen mapped. Es fehlt ein else-Zweig, falls etwas unbekanntes kommt, sollte das nicht einfach nur ignoriert werden. Die while-Schleife, die im Normalfall nur einmal durchlaufen wird ist aus dem selben Grund seltsam.
Lesen von Filehandles kann man statt über Threads mit tkinter auch über tkinter.createfilehandler machen. Dann läuft das innerhalb des Event-Loops und Du kannst die GUI verändern.
Bezugnehmend auf den Code, der in meinem Postfach gelandet ist:
Halte Dich an die Namenskonventionen, das macht das lesen für alle, auch für Dich, leichter: nur Klassen schreibt man mit GroßemAnfangsbuchstaben, Methoden, Funktionen und Variablen klein_mit_unterstrich, Konstanten KOMPLETT_GROSS.
Sternchenimporte vermeiden, tkinter wird üblicherweise als `import tkinter as tk` importiert und alle Namen per tk.xy angesprochen.
In `Anzeige_Timer` hast Du das selbe Problem, hier mischst Du auch verschiedene Ströme, die man nicht auseinander halten kann. Wenn Deine Uhr 5 Sekunden schickt, dann landest Du in der anderen Funktion auf der Score-Seite. Das darf nicht passieren. Du mußt die einzelnen Ströme klar trennen, z.B. mit einem Protokoll, das den Typ der Daten angibt und nur einer Schleife (tkinter.createfilehandler), die alle Events abarbeiten kann. Sagte ich schon, dass eine globale Variable `s` schlecht ist?
`struct.unpack` ist ja gerade dazu da, dass man eine ganze Struktur entpacken kann, da also drei einzelne Zahlen zu entpacken ist umständlich und unleserlich.
Code: Alles auswählen
seconds, minutes, stunden = struct.unpack('!ddd', data)
(Warum sind `stunden` deutsch benannt?)
Die Klassen `Timer`, `Stopwatch` und `Interval_Timer` sind so identisch, dass sie eigentlich nur eine Klasse sein sollten, und die Unterschiede durch Argumenten bei der Initialisierung beschrieben werden.