Связь между Tkinter и Socket - PullRequest
       5

Связь между Tkinter и Socket

0 голосов
/ 04 марта 2020

для проекта мне нужно создать Tkinter GUI, который отображает данные, отправленные Socket. Я думал о методе after (), но не знаю, как его использовать. Может кто-нибудь мне поможет? Спасибо

Вот весь мой код: https://pastecode.xyz/view/5b23d322

и вот только функция, которая проверяет, что что-то приходит:

def verifsock():
   global socket
   socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   socket.bind(('172.16.2.220', 15555))

   socket.listen(5)
   client, address = socket.accept()
   print ("{} connected".format( address ))

   response = client.recv(255)
   if response != "":
       log.insert(END, response)
   else:
       return

РЕДАКТИРОВАТЬ:

def eleve2():


quitterMDPeleve()
global eleve2
eleve2 = tk.Tk()
eleve2.title("Espace élèves")
eleve2.config(bg='#A26F65')
eleve2.geometry('1650x1050')

global logRec

logRec = tk.Text(eleve2, width=25, height=20, takefocus=0, font = ('Tw Cen MT', 15))
logRec.place(x=400, y=310, anchor='w')

global threadEl

threadEl = threading.Thread(target=verifsock)
threadEl.daemon = True # without the daemon parameter, the function in parallel will continue even your main program ends
threadEl.start()

eleve2.mainloop()

и вызванная функция:

def verifsock():
global socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('172.16.2.220', 15555))

socket.listen(5)
client, address = socket.accept()
print ("{} connected".format( address ))

response = client.recv(255)
if response != "":
    logRec.insert(END, response)
else:
    return

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Мне наконец удалось решить эту проблему, спасибо всем, кто мне помог;)

Вот мой код для тех, кому интересно:

def eleve2():


quitterMDPeleve()
global eleve2
eleve2 = tk.Tk()
eleve2.title("Espace élèves")
eleve2.config(bg='#A26F65')
eleve2.geometry('1650x1050')

global logRec

logRec = tk.Text(eleve2, width=25, height=20, takefocus=0, font = ('Tw Cen MT', 15))
logRec.place(x=400, y=310, anchor='w')

global threadEl

threadEl = threading.Thread(target=verifsock)
threadEl.daemon = True # without the daemon parameter, the function in parallel will continue even your main program ends
threadEl.start()

eleve2.mainloop()



def verifsock():
global socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('172.16.2.220', 15555))
while True:

    socket.listen(5)
    client, address = socket.accept()
    print ("{} connected".format( address ))

    response = client.recv(255)
    response2 = response.decode("utf-8")
    if response2 != "":
        logRec.insert(END, str(response2)+"\n")
    else:
        return
0 голосов
/ 04 марта 2020

Несколько советов:

Вам нужно будет сделать несколько «бесконечных циклов» (например, while True), используя потоков :

  • один л oop принимать новые соединения
  • один l oop ожидание сообщений (получатель)
  • один l oop для интерфейса graphi c (ваш tkinter.Tk().mainloop())

Вам не нужно событие after(). Например, при получении сообщения сокета вы можете обновить переменную в GUI.

EDIT

Вот небольшой пример использования threads. Основная программа просто создает поток, ждет 3 секунды и печатает «конец основной программы». Параллельный поток выполняет функцию counter(), которая печатает инкрементную переменную каждую секунду.

import threading
import time

def counter():
    c = 0
    while True:
        print(c)
        c += 1
        time.sleep(1)

thread_1 = threading.Thread(target=counter)
thread_1.daemon = True # without the daemon parameter, the function in parallel will continue even your main program ends
thread_1.start()

# MAIN PROGRAM
time.sleep(3)
print("end main program")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...