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()
TCP Server + GUI in Python 1 Programm
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.Gruss wuf
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
Take it easy Mates!
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.
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.