D
Dexter Deejay
When i try to run this code and to connect to server (server is written in java that part of code is ok) everything stalls. Thread that i created hereoccupies processor all the time and GUI freezes. It's supposed to be waiting for message from server. (asynchronous one) Is there something that i did wrong here, or is there better way to do this?
from tkinter import *
from threading import *
import time
import socket
import sys
comPort=0
msg=""
name=socket.gethostbyname(socket.gethostname())
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
testArea=0
thread=0
def threadFunc():
global sock
global textArea
data=""
while(data==""):
try:
data=str((sock.recvfrom(256)),"UTF-8")
except BlockingIOError:
print("failed")
time.sleep(1)
data=""
textArea.add((data+"\n"))
def sendMsg():
global sock
message=name+": "+msg.get()+"\n"
sock.send(bytes(message,"UTF-8"))
def aboutCommand():
messagebox.showinfo(title="About",message="This is first (serious) aplication in python.")
def helpCommand():
messagebox.showinfo(title="Help",message="BAZINGA!")
def Connect():
global sock
global thread
sock.connect((serverIPString.get(), 16000))
sock.send(bytes("#connect request#\n",'UTF-8'))
data=sock.recvfrom(256)
reply=str(data[0],"UTF-8")
answer=(reply.split("#",3))
if(answer[1]!="connected"):
messagebox.showinfo(title="Error",message="Connection failed!")
return
sock.close();
sock=None
comPort=int(answer[2]) #for new connection
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((serverIPString.get(), comPort))
sock.setblocking(0)
thread=Thread(target=threadFunc())
thread.start()
def Disconnect():
global sock
sock.send(bytes("#END#\n","UTF-8"))
sock.close()
def ExitApplication():
Disconnect()
mGui.destroy()
return
mGui=Tk()
msg=StringVar()
serverIPString=StringVar()
mGui.geometry("400x600+200+20")
mGui.title("Chat client v1.0")
labServer=Label(mGui,text="Server IP adress: ").pack()
entServer=Entry(mGui,textvariable=serverIPString).pack()
btnConnect=Button(mGui,text="Connect",fg="red",bg="blue",command=Connect).pack()
btnDisconnect=Button(mGui,text="Disconnect",fg="red",bg="blue",command=Disconnect).pack()
textArea=Text(mGui,bg="yellow").pack()
entMessage=Entry(mGui,textvariable=msg).pack()
btnSendMsg=Button(mGui,text="Send message",fg="white",bg="black",command=sendMsg).pack()
menuBar=Menu(mGui)
fileMenu=Menu(menuBar,tearoff=0)
fileMenu.add_command(label="Exit",command=ExitApplication)
menuBar.add_cascade(label="File",menu=fileMenu)
optionsMenu=Menu(menuBar,tearoff=0)
optionsMenu.add_command(label="Change chat name")
optionsMenu.add_command(label="Connect",command=Connect)
optionsMenu.add_command(label="Disconnect",command=Disconnect)
menuBar.add_cascade(label="Options",menu=optionsMenu)
helpMenu=Menu(menuBar,tearoff=0)
helpMenu.add_command(label="Help",command=helpCommand)
helpMenu.add_command(label="About",command=aboutCommand)
menuBar.add_cascade(label="Info",menu=helpMenu)
mGui.config(menu=menuBar)
mGui.mainloop()
from tkinter import *
from threading import *
import time
import socket
import sys
comPort=0
msg=""
name=socket.gethostbyname(socket.gethostname())
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
testArea=0
thread=0
def threadFunc():
global sock
global textArea
data=""
while(data==""):
try:
data=str((sock.recvfrom(256)),"UTF-8")
except BlockingIOError:
print("failed")
time.sleep(1)
data=""
textArea.add((data+"\n"))
def sendMsg():
global sock
message=name+": "+msg.get()+"\n"
sock.send(bytes(message,"UTF-8"))
def aboutCommand():
messagebox.showinfo(title="About",message="This is first (serious) aplication in python.")
def helpCommand():
messagebox.showinfo(title="Help",message="BAZINGA!")
def Connect():
global sock
global thread
sock.connect((serverIPString.get(), 16000))
sock.send(bytes("#connect request#\n",'UTF-8'))
data=sock.recvfrom(256)
reply=str(data[0],"UTF-8")
answer=(reply.split("#",3))
if(answer[1]!="connected"):
messagebox.showinfo(title="Error",message="Connection failed!")
return
sock.close();
sock=None
comPort=int(answer[2]) #for new connection
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((serverIPString.get(), comPort))
sock.setblocking(0)
thread=Thread(target=threadFunc())
thread.start()
def Disconnect():
global sock
sock.send(bytes("#END#\n","UTF-8"))
sock.close()
def ExitApplication():
Disconnect()
mGui.destroy()
return
mGui=Tk()
msg=StringVar()
serverIPString=StringVar()
mGui.geometry("400x600+200+20")
mGui.title("Chat client v1.0")
labServer=Label(mGui,text="Server IP adress: ").pack()
entServer=Entry(mGui,textvariable=serverIPString).pack()
btnConnect=Button(mGui,text="Connect",fg="red",bg="blue",command=Connect).pack()
btnDisconnect=Button(mGui,text="Disconnect",fg="red",bg="blue",command=Disconnect).pack()
textArea=Text(mGui,bg="yellow").pack()
entMessage=Entry(mGui,textvariable=msg).pack()
btnSendMsg=Button(mGui,text="Send message",fg="white",bg="black",command=sendMsg).pack()
menuBar=Menu(mGui)
fileMenu=Menu(menuBar,tearoff=0)
fileMenu.add_command(label="Exit",command=ExitApplication)
menuBar.add_cascade(label="File",menu=fileMenu)
optionsMenu=Menu(menuBar,tearoff=0)
optionsMenu.add_command(label="Change chat name")
optionsMenu.add_command(label="Connect",command=Connect)
optionsMenu.add_command(label="Disconnect",command=Disconnect)
menuBar.add_cascade(label="Options",menu=optionsMenu)
helpMenu=Menu(menuBar,tearoff=0)
helpMenu.add_command(label="Help",command=helpCommand)
helpMenu.add_command(label="About",command=aboutCommand)
menuBar.add_cascade(label="Info",menu=helpMenu)
mGui.config(menu=menuBar)
mGui.mainloop()