繁体   English   中英

Tkinter GUI中的线程套接字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM