I decided to make a small project to master the python, made a chat. In cmd format, everything works well on the local network, in tkinter it does not. I can not understand why?
import socket import threading import time import tkinter as tk from tkinter import * from tkinter import ttk shutdown = False join = False a = time.strftime("%Y-%m-%d, %H.%M.%S", time.localtime()) register = False s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("gmail.com", 80)) # для точного ip host = socket.gethostbyname(s.getsockname()[0]) port = 0 # подключается к сети, а не создает ее s.close() server = ('192.168.1.5', 7010) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # tcp and ip s.bind((host, port)) # connection on host, ip s.setblocking(0) # чтобы не было ошибок при выходе def send_all(): message = text_field.get() global alias if message != "": s.sendto(('[ ' + alias.get() + " ] send :: " + message).encode('utf-8'), server) text_field.delete(0, END) def receving(name, sock): # прием данных от других клиентов while not shutdown: try: while True: data, addr = sock.recvfrom(1024) mes.set(data.decode('utf-8')) mail(ms.get()) message_all.insert('end', len(message_all), mess + "\n") time.sleep(0.2) except: pass def send_reg_s(): global alias alias.set(text_reg.get()) s.sendto(("[ " + alias.get() + " ] ==> join chat ^^ ").encode('utf-8'), server) child.destroy() def send_btn(): send_all() def enter_btn(event): send_all() def send_reg(): send_reg_s() def enter_reg(event): send_reg_s() def mail(mess): s = '{}\n'.format(mess) message_all.insert(tk.END, s) message_all.see(tk.END) #message_all.insert('end', len(message_all), mess + "\n") #message_all.insert('end', mess + "\n") def quit(): global alias s.sendto( ('[ ' + alias.get() + " ] <== left chat :c ").encode('utf-8'), server) shutdown = True app.destroy() rT.join() s.close() app = tk.Tk() app.title('Chat Client') app.minsize(250, 250) app.maxsize(500, 500) alias = StringVar() mes = StringVar() rT = threading.Thread(target=receving, args=( 'RecvThread', s)) # создание многопоточности rT.start() if register == False: child = Toplevel(app) child.title('Авторизация в чате') message_label = ttk.Label( child, text="Впишите ваше имя", font='Comicssans 10') message_label.pack(side=TOP) text_reg = ttk.Entry(child, width=100) text_reg.pack(side=TOP) text_reg.bind('<Return>', enter_reg) text_reg.focus_force() btn_send = tk.Button(child, width=10, height=2, text="Send", command=send_reg) btn_send.pack(side=TOP) child.wm_attributes('-topmost', True) message_label = ttk.Label(app, text="Все сообщения", font='Comicssans 10') message_label.pack(side=TOP) message_label = ttk.Label(app, text=a, font='Comicssans 10') message_label.pack(side=TOP) message_scrollbar = Scrollbar(app, bg='gray') message_all = Text(app, width=70,) message_all.yview() message_all.pack(side=TOP) message_all.config(state=DISABLED, yscrollcommand=message_scrollbar.set) text_field = ttk.Entry(app, width=100) text_field.pack(side=TOP) text_field.bind('<Return>', enter_btn) text_field.focus_force() btn_send = tk.Button(app, width=10, height=2, text="Send", command=send_btn) btn_send.pack(side=TOP) quit_btn = tk.Button(app, width=10, height=2, text="Quit", command=quit) quit_btn.pack(side=RIGHT,) # бесконечный цикл app.mainloop()
Here is the server itself, if needed:
import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("gmail.com", 80)) host = socket.gethostbyname(s.getsockname()[0]) # выбирает айпи port = 7010 s.close() clients = [] # здесь будут ники # обьявляем протоколы tcp и ip соответсвенно s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((host, port)) quit = False # чтобы можно было закрыть бессконечный цикл print(f'[Server Started: {host},{port}]') while not quit: try: data, addr = s.recvfrom(1024) if addr not in clients: # если нет адресса в сохраненных - добавляем clients.append(addr) for client in clients: s.sendto('welcome to the club, buddy!'.encode('utf-8'), addr) #v, p = data.decode('utf-8').split() #user(v, p) itsatime = time.strftime( '%Y-%m-%d-%H.%M.%S', time.localtime()) # время с локалки print("[ " + addr[0] + ' ] = [ ' + str(addr[1]) + " ] = [ " + itsatime + "]/", end='') print(data.decode('utf-8')) for client in clients: s.sendto(data, client) except: print('[ Server Stopped ]') quit = True s.close()