Найти - Пользователи
Полная версия: Помогите решить проблему с Tkinter и Socket
Начало » GUI » Помогите решить проблему с Tkinter и Socket
1
aaa49400
Здравствуйте. Есть два кода: серверная и клиентская часть (работают через Socket), серверная работает хорошо, клиент тоже работает но почему то только один раз. После повторного нажатия кнопки нужно перезапускать клиент иначе - ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:/Users/User/PycharmProjects/untitled/Button.py", line 15, in button_click
sock.connect(("localhost", 65042))
OSError: [WinError 10038] Сделана попытка выполнить операцию на объекте, не являющемся сокетом
Клиент:
 from tkinter import Tk, Button
from PIL import ImageTk
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
root = Tk()
root.title("Help")
root.attributes('-topmost',True)
image = ImageTk.PhotoImage(file="help.png")
def button_click():
        sock.connect(("localhost", 65042))
        sock.sendall(bytes(host, "utf-8"))
        data = sock.recv(1024)
        sock.close()
        print(data.decode("utf-8"))
Button(root, image=image, command=button_click).pack()
root.mainloop()
Сервер:
 import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 65042))
sock.listen(True)
while True:
    conn, addr = sock.accept()
    print('Connected by', addr)
    data = conn.recv(1024)
    conn.sendall(data)
    print(data)
marvellik
aaa49400 ну вы же сокет создаете вне функции а потм вызвав функцию после отправки закрываете сокет. при повторном вызове у вас нет открытого сокета вот вам и ошибка
 from tkinter import Tk, Button
from PIL import ImageTk
import socket
host = socket.gethostname()
root = Tk()
root.title("Help")
root.attributes('-topmost',True)
image = ImageTk.PhotoImage(file="help.png")
def button_click():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(("localhost", 65042))
        sock.sendall(bytes(host, "utf-8"))
        data = sock.recv(1024)
        sock.close()
        print(data.decode("utf-8"))
Button(root, image=image, command=button_click).pack() 
root.mainloop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB