StringVar() in thread

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.
Antworten
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

hey
in meinem code funktioniert alles wie es soll.
ich möchte aber auch das programm schließen und erneut ausführen können.
beim zweiten start allerdings funktioniert der StringVar start_Client nicht mehr.
jede hilfe ist mir willkommen :)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter
from Tkinter import *
import threading
import socket
import datetime
import json
from  Tkinter import Tk, StringVar, Label

def run():

    backwin = Tkinter.Tk()
    backwin.title('DMD-DATA.soft')
    backwin.state('zoomed')
    backwin.configure(background='black')

    start_Server = Tkinter.StringVar()
    l_sf1 = Tkinter.Label(backwin,textvariable=(start_Server),font=('Arial', 8, 'bold'), height=2, width=25, fg="#000000000",justify='left')
    l_sf1.place(relx=.06, rely=.97, anchor="c")

    #-----------------
    start_Client = Tkinter.StringVar()
    #-----------------
    l_sf2 = Tkinter.Label(backwin,textvariable=(start_Client),font=('Arial', 8, 'bold'), height=2, width=35, fg="#000000000",justify=LEFT)
    l_sf2.place(relx=.2, rely=.97, anchor="c")

    get_IP = [TCP_IP for TCP_IP in socket.gethostbyname_ex(socket.gethostname())[2] if not TCP_IP.startswith("127.")][:1]
    TCP_PORT = 9090
    server_address = ((TCP_IP,TCP_PORT))

    def server_Start(backwin,server_address):

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_address = ((TCP_IP,TCP_PORT))
        sock.bind(server_address)
        messageServer = "Server gestartet: "+str(TCP_IP)
        start_Server.set(str(messageServer))
        sock.listen(5)

        while True:

            client,addr = sock.accept()
            now = datetime.datetime.now()
            currentTime = now.strftime("%d.%m.%Y, %H:%M:%S")
            client.send("\n---> DMD-Server ("+str(currentTime)+")\n")
            data = client.recv(25000)
            json_data  = json.loads(data)
            user = json_data['User']
            messageClient = "\n---> "+str(user)+" ("+str(currentTime)+")\n"
            start_Client.set(str(messageClient))

            #print json_data

            client.close()

        sock.close()

    event = threading.Event()
    new_thread = threading.Thread(target=server_Start,args=(backwin,server_address,))
    new_thread.start()

    def beenden(event):
        event.set()
        backwin.destroy()
        try:
            backwin.destroy()
        except:
            pass

    b = Tkinter.Button(backwin, text=("\nBEENDEN\n"), font=('Arial', 10, 'bold'), width=20, relief="raised", borderwidth=3, fg='#000000000', justify='center',command=lambda:beenden(event))
    b.place(relx=.51, rely=.82, anchor="c")

    backwin.mainloop()

run()
Zuletzt geändert von Anonymous am Dienstag 6. Dezember 2016, 17:08, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: ich verstehe Deine Frage nicht. Was meinst Du mit »start_Client funktioniert nicht mehr?«, wie startest Du das Programm zum zweiten Mal?
Ich glaube das folgende hab ich Dir nicht zum ersten Mal geschrieben:
Zeile 5: *-importe sind böse, aber Du verwendest ja auch nichts daraus.
Zeile 10: diese Namen verwendest Du auch nirgends.
Zeile 29: das get_IP quatsch ist, sagte ich schonmal
Zeile 31: TCP_IP wird innerhalb einer LC definiert und sollte nicht außerhalb benutzt werden. Die Schreibweise suggeriert eine Konstante, was es aber nicht ist.
Zeile 33: Funktionen sollten nicht innerhalb von Funktionen definiert werden
Zeile 37: server_address wird schon als Argument übergeben
Zeile 39: TCP_IP ist schon ein String, benutze .format
Zeile 40: messageServer ist schon ein String
Zeile 48: currentTime ist schon ein String, benutze .format
Zeile 49: recv liefert von 1 bis 50000 Zeichen, benutze makefile
Zeile 52/53: s.o.
Zeile 61: event wird nicht benutzt
Zeile 69: doppelt hält besser??
Zeile 70: keine nackten excepts benutzen!
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

ja, danke. ich sollte das wohl besser vorher noch einmal kontrollieren. SORRY :)

also wenn ich dieses programm starte, funktioniert alles:
die namen werden zwischen pc und handy ausgetauscht
label l_sf1 zeigt die IP-Adresse an und label l_sf2 zeigt an wer sich gerade anmeldet.
wenn ich aber auf BEENDEN drück und das programm erneut starte, zeigt das label l_sf2 keinen namen mehr an.
alles andere funktioniert immer noch.
eine fehlerausgabe gibt es auch nicht :(
ich versteh nicht, woran das liegt.
(soll ich den geänderten code nochma hochladen? sorry noch einmal)
BlackJack

@DMD-OL: Das Programm beendet sich doch gar nicht wenn man auf BEENDEN drückt. Soweit ich das sehe läuft das bis zum Sankt Nimmerleinstag weiter weil der Thread aus einer Endlosschleife besteht.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

wie kann ich denn den socket und thread mit klick auf beenden komplett schließen?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: der einfachste Weg, wie ich ihn Dir schon bei meiner ersten Antwort zu diesem Themenkomplex geschrieben habe, ist der, den Thread als daemon zu setzen. Weniger harte Möglichkeit wäre es, ein Event zu nehmen, und den Server sich selbst beenden zu lassen. Dazu darf der aber nicht im accept hängen bleiben, man muß also einen Timeout setzen.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

das habe ich alles versucht, nicht habe ich hinbekommen :(
ich habe inzwischen den eigentlichen fehler gefunden.
ich habe pc und handy feste ports verpasst, was bei einer zweiten
anmeldung am selben socket ja probleme bereitet.
aber trotzdem danke für deine unterstützung :)
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: Du hast nicht den eigentlichen Fehler gefunden, sondern eine Umgehungslösung, die das eigentliche Problem umschifft. Weil Du Deinen Server nicht sauber beendest und nicht sagst, dass der Port wiederverwendet werden kann, mußt Du auf einen anderen Port ausweichen.

Was hast Du versucht, und was funktionierte nicht?
Antworten