TCP Server + GUI in Python 1 Programm

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
Plotus92
User
Beiträge: 3
Registriert: Dienstag 12. Juni 2018, 15:34

Moin Python Experten^^,

habe eine kurze Frage. Habe in Python einen TCP Server geschrieben und ein GUI. Im Moment sind es 2 separate Programme. Möchte diese nun gerne zusammenführe. Nur leider futzt das nicht so wie gedacht. Entweder startet der Server und sobald dieser geschlossen wird das GUI oder umgekehrt. Das GUI wurde mit Tkinter geschrieben. Würde mich über Lösungsansätze freuen ^^

Der Server :

import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip = socket.gethostbyname(socket.gethostname())
port = 1234
address = (ip,port)
server.bind(address)
server.listen(1)
print ("[*] Looking for Connection ",ip,":",port)
client,addr = server.accept()
print ("[*] Connection from ",addr[0],":",addr[1])
while True:
data = client.recv(1024)
print ("[*] Received",data," from client")
print ("[*] Processing data")
if(data==b"Hello Server"):
client.send(b"Hello client")
print ("Processing done.\n[*] Replay sent")
elif(data==b"disconnect"):
client.send(b"Goodbye")
client.close()
break
else:
client.send(b"Invalid data")
print ("Processing Invalid data.\n[*] Replay sent")

Das GUI :

from tkinter import*
import random
import time
import tkinter as tk

#Window Construction

root=Tk()
root.geometry("400x200")
root.title("Light v.1")
root.resizable(False, False)

#Variable Section

BG = Frame(root,width=400,height=200)
BG.pack(side=TOP)

Panel1 = Frame(root,width=200,height=100)
Panel1.pack(side=LEFT)

Info=Label(BG,font=('arial',20,'bold'),text="Time Settings",fg="black",bd=10,anchor='w')
Info.grid(row=0,column=0)

#Clock Section

time_one=''
Info_Time=Label(BG,font=('arial',20,'bold'),fg="green",bd=10,anchor='w')
Info_Time.grid(row=1,column=0)

time_one=''
def update_Time():
global time_one
time_two=time.strftime('%H:%M:%S')
# Update String for Time
if time_two != time_one:
time_one = time_two
Info_Time.config(text=time_two)
#Calling every 200ms
Info_Time.after(200, update_Time)
update_Time()

#Entry Section

Display1=Entry(Panel1,font=('comic sans',10,'bold'))
Display1.grid(row=1,column=1)
Display2=Entry(Panel1,font=('arial',10,'bold'))
Display2.grid(row=1,column=2)
Display3=Entry(Panel1,font=('arial',10,'bold'))
Display3.grid(row=2,column=1)
Display4=Entry(Panel1,font=('arial',10,'bold'))
Display4.grid(row=2,column=2)

#Text Section

Text1=Label(Panel1,text="Von").grid(row=1,column=0)
Text2=Label(Panel1,text="Bis").grid(row=2,column=0)

Text_Min=Label(Panel1,text="Stunden").grid(row=0,column=1)
Text_Min=Label(Panel1,text="Minuten").grid(row=0,column=2)



#Button Section
def getInput():
A=int(Display1.get())
B=Display2.get()
C=Display3.get()
D=Display4.get()
print(A,B,C,D)

global operator
operator=[A,B,C,D]

b1= Button(BG,text="Apply",command=getInput).grid(row=3)


root.mainloop()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Plotus92

Könntest du dein Skript bitte nochmals in den Tags für Python Skripte zeigen?

Gruss wuf ;-)
Take it easy Mates!
Plotus92
User
Beiträge: 3
Registriert: Dienstag 12. Juni 2018, 15:34

wuf hat geschrieben: Dienstag 12. Juni 2018, 19:00 Hi Plotus92

Könntest du dein Skript bitte nochmals in den Tags für Python Skripte zeigen?

Gruss wuf ;-)
Was meinst du genau?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Plotus92

Beim Forum Editor musst du die Schaltfläche Vollständiger Editor aktivieren. Dann siehst du ganz rechts oberhalb des Editorfensters die Bezeichnung Python. Diese Bezeichnung musst du anklicken. Dann wird dir im Editor automatisch die Tags für die Einbettung deines Python Skripts platziert. Idiotischerweise kann ich dir diese Tags hier nicht in Worte zeigen da diese für den Editor reservierte Worte enthalten. Dein Skript wird dann in diesem Fenstertyp mit korrekten Einrückungen angezeigt.

Code: Alles auswählen

Hier steht dann dein Skript
Gruss wuf ;-)
Take it easy Mates!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du brauchst einen eigenen Thread, in dem der Server läuft und die GUI läuft im Hauptthread.

Dein Server ist fehlerhaft. recv(1024) liefert 1 bis 1024 Bytes zurück. Dass da mal "Hello Server" am Stück und nicht in mehreren recv-Aufrufen zurückkommt ist reiner Zufall. Ebenso sendet send nicht unbedingt alles, dafür gibt es sendall. Den eigenen Hostnamen an bind zu binden führt dazu, dass man nur über ein Gateway auf den Server zugreifen kann. Normalerweise nimmt man Any-IP 0.0.0.0. if und elif sind keine Funktionen, die Klammern also unnötig.
Antworten