Итак, я могу легко написать небольшой скрипт для прослушивания пакетов UDP на определенном IP / порте, но я изо всех сил пытаюсь внедрить его в графический интерфейс Tkinter.
Всякий раз, когда я пытаюсь использовать бесконечныйв то время как True: цикл запускается кнопкой, приложение GUI падает.Я провел дополнительное исследование и немного прочитал об использовании задержек, но не могу заставить его работать должным образом.Я попытался поместить цикл while в прокси-функцию, которая вызывает функцию startreceiving, но это также приводит к сбою графического интерфейса.Приведенный ниже код позволяет настроить и запустить мои текущие проблемы.
Последний вопрос: как я могу получить кнопку для запуска события, чтобы начать отправку пакетов, и в то же время иметь возможность принимать события кнопки для запуска ипрекратить прием пакетов?
import socket
import tkinter as tk
import tkinter.font as tkFont
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = b"Hello, world"
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
def startsending(run=True):
while run is True:
print("Sending Message.")
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
def startreceiving(run=True):
while run is True:
try:
data, addr = sock.recvfrom(1024)
print("received message:", data)
print("from: ", addr)
except OSError:
break
class App(tk.Frame):
STRIDE = 8
DELAY = 100
variables = []
for i in range(10):
variables.append(i)
sensors = []
for i in range(3):
sensors.append(i)
fields = []
for i in range(len(sensors) * len(variables)):
fields.append(i)
def __init__(self, master=None):
tk.Frame.__init__(self,master)
self.grid()
self.create_widgets()
self.after(self.DELAY, self.update, self.DELAY)
#---- Create the GUI Layout ----
def create_widgets(self):
self.btn_font = tkFont.Font(family="Helvetica", size=12, weight='bold')
self.gui_buttons = []
self.send_button = tk.Button(self,
text = format("Begin Sending."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
command = self.send_message)
self.send_button.grid(column=2, row=11)
self.start_button = tk.Button(self,
text = format("Begin Receiving."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
command = self.start_receiving)
self.start_button.grid(column=3, row=11)
self.stop_button = tk.Button(self,
text = format("Stop Receiving."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
padx = 6,
state='disabled',
command = self.stop_receiving)
self.stop_button.grid(column=3, row=12)
x = 0
y = 1
for i, label in enumerate(self.variables):
label = tk.Label(self,
text = format("Variable " + str(i)),
font = self.btn_font,
padx = 10)
label.grid(column=x, row=y)
y += 1
x = 1
y = 0
for i, label in enumerate(self.sensors):
sensor = tk.Label(self,
text = format("Sensor " + str(i)),
font = self.btn_font,
padx = 20,
relief = tk.RIDGE)
sensor.grid(column=x, row=y)
x += 1
x = 1
y = 1
for i, field in enumerate(self.fields):
field = tk.Entry(self,
width=10,
text=format("field val " + str(i)),
font=self.btn_font,
state='disabled')
field.grid(column=x, row=y)
y += 1
if y > len(self.variables):
y = 1
x += 1
#----Proxy to call the start receiving method using a delay and set the corresponding buttons to normal/disabled.
def start_receiving(self):
self.start_button.config(state='disabled')
self.stop_button.config(state='normal')
self.after(self.DELAY, startreceiving, self.DELAY)
#----Proxy to call the stop receiving method using a delay and set the corresponding buttons to normal/disabled.
def stop_receiving(self):
self.stop_button.config(state='disabled')
self.start_button.config(state='normal')
self.after(self.DELAY, startreceiving(False), self.DELAY)
self.after(self.DELAY, startsending(False), self.DELAY)
#----Proxy to call the start sending method using a delay.
def send_message(self):
self.after(self.DELAY, startsending, self.DELAY)
app = App()
app.master.title('ESDR')
app.master.geometry('640x480')
app.mainloop()