[英]threading socket in Tkinter GUI
我编写了一个非常简单的程序来保存来自远程传感器的数据。 当我按Tkinter GUI上的“开始”按钮时,我想运行一个带有套接字连接和数据接收的并行线程。 但是,当我进行大约10秒钟的测量时,我的Tkinter GUI被冻结,并且出现Windows错误“程序停止响应”,但是我的套接字正在工作,并且所有数据保存后,GUI都恢复了生命。 我是否使用穿线不好?
#import
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
import json
import threading
import socket
import select
def askdirectory():
global FilePath_text
dirname = filedialog.askdirectory()
if dirname:
FilePath_text.set(dirname)
def serwer():
global Status
# host = '192.168.137.93'
#port = 56606
timeout = 1
Status = "Not Connected"
buffer_size = 5048576
esp = ('192.168.137.93', 56606)
connectFlag=0
command = {"accel": accelnumber.get(),
"gyro": gyronumber.get(),
"magnet": magnetnumber.get(),
"time": measuretime.get(), }
print("zmienne ok")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.setblocking(0)
print("socket ok")
#s.bind(esp)
#print("bind ok")
print(json.dumps(command))
#ready = select.select([], [s], [], timeout)
try:
s.connect(esp)
s.send(bytearray(json.dumps(command), 'utf-8'))
Status = " Connected "
print(Status)
s.setblocking(0)
connectFlag=1
except socket.error as msg:
Status = "Not connected"
print("Connection error")
print(msg)
while connectFlag:
steady = select.select([s], [], [], timeout)
if steady[0]:
data = s.recv(buffer_size)
if data:
with open('Pomiar.txt', 'a') as f:
f.write("%s" % data)
flag = 1
elif flag == 1:
with open('Pomiar.txt', 'r') as file:
data_read = file.read()
data_trimmed = data_read.replace("\'b\'", '')
data_final = data_trimmed.replace("r", '').replace("\\", '').replace("n", "\n")
file_new = open('Pomiar_ok.txt', 'a')
file_new.write("%s" % data_final[16:(len(data_final) - 1)])
file_new.close()
break
f.close()
def measureStart():
t1 = threading.Thread(target=serwer)
t1.daemon = True
t1.start()
# createWindow
window = Tk()
window.geometry("400x300")
window.title("Data Acquisition Server")
# define labels
Status = StringVar()
labelflag = bool(0)
l1 = Label(window, text="Sensor:")
l1.grid(row=0, column=0)
l2 = Label(window, text="Status")
l2.grid(row=1, column=0)
if Status == " Connected ":
l13 = Label(window, text=Status, fg="green")
l13.grid(row=1, column=1)
else:
l13 = Label(window, text=Status, fg="red")
l13.grid(row=1, column=1)
l3 = Label(window, text="Accelerometer range[G]")
l3.grid(row=2, column=2)
l4 = Label(window, text="Gyroscope range[DPS]")
l4.grid(row=3, column=2)
l5 = Label(window, text="Magnetometer range[Guss]")
l5.grid(row=4, column=2)
l6 = Label(window, text="Accelerometer")
l6.grid(row=2, column=0)
l7 = Label(window, text="Gyroscope")
l7.grid(row=3, column=0)
l8 = Label(window, text="Magnetometer")
l8.grid(row=4, column=0)
l9 = Label(window, text="LSM9DS1")
l9.grid(row=0, column=1)
l10 = Label(window, text=" ")
l10.grid(row=5, column=2)
l11 = Label(window, text="Measure Time")
l11.grid(row=6, column=0)
l12 = Label(window, text=" ")
l12.grid(row=8, column=2)
#define comboboxes with sensor ranges
accelnumber = IntVar()
AccelRange = ttk.Combobox(window, height=1, width=4, textvariable=accelnumber)
AccelRange['values'] = (2, 4, 8, 16)
AccelRange.current(0)
AccelRange.grid(row=2, column=3)
gyronumber = IntVar()
GyroRange = ttk.Combobox(window, height=1, width=4, textvariable=gyronumber)
GyroRange['values'] = (245, 500, 2000)
GyroRange.current(0)
GyroRange.grid(row=3, column=3)
magnetnumber = IntVar()
MagnetRange = ttk.Combobox(window, height=1, width=4, textvariable=magnetnumber)
MagnetRange['values'] = (4, 8, 12, 16)
MagnetRange.current(0)
MagnetRange.grid(row=4, column=3)
# define checkboxes
CheckVar1 = IntVar()
AccelCheck = Checkbutton(variable=CheckVar1, onvalue=1, offvalue=0, height=1, width=1)
AccelCheck.grid(row=2, column=1)
CheckVar2 = IntVar()
GyroCheck = Checkbutton(variable=CheckVar2, onvalue=1, offvalue=0, height=1, width=1)
GyroCheck.grid(row=3, column=1)
CheckVar3 = IntVar()
MagnetCheck = Checkbutton(variable=CheckVar3, onvalue=1, offvalue=0, height=1, width=1)
MagnetCheck.grid(row=4, column=1)
# spin box for time of measure
measuretime = IntVar()
time = Spinbox(window, from_=1, to=30,textvariable=measuretime, width=10)
time.grid(row=6, column=0, columnspan=3)
# path choose
l12 = Label(window, text="Choose file path:")
l12.grid(row=7, column=0)
FilePath_text = StringVar()
e1 = Entry(window, textvariable=FilePath_text)
e1.grid(row=7, column=0, columnspan=4)
path = Button(window, text="...", command=askdirectory)
path.grid(row=7, column=2, columnspan=2)
# startButton
start = Button(window, text="START", command=measureStart, width=10)
start.grid(row=9, column=2, )
window.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.