Python Tkinter,停止线程功能

时间:2017-03-26 19:09:06

标签: python multithreading function tkinter

我正在为3D打印机开发GUI,我遇到了如何停止线程功能的问题。我希望能够在我的GUI中单击一个具有另一个功能的按钮,该按钮将阻止线程功能通过串行端口发送G代码串。目前,该功能具有线程,以允许在打印期间触发其他功能。我非常感谢有关如何合并此停止功能的一些建议。

下面是打开G代码文件并通过串口发送每一行的功能。

def printFile():
def callback():
    f = open(entryBox2.get(), 'r');
    for line in f:
        l = line.strip('\r')
        ser.write("<" + l + ">")
        while True:
            response = ser.read()
            if (response == 'a'):
                break
t = threading.Thread(target=callback)
t.start()

2 个答案:

答案 0 :(得分:0)

线程无法停止,它们必须自行停止。所以你需要向线程发送一个信号,它是时候停止了。这通常使用Event来完成。

stop_event = threading.Event()
def callback():
    f = open(entryBox2.get(), 'r');
    for line in f:
        l = line.strip('\r')
        ser.write("<" + l + ">")
        while True:
            response = ser.read()
            if (response == 'a'):
                break
            if stop_event.is_set():
                break
t = threading.Thread(target=callback)
t.start()

现在,如果您在代码中的其他位置设置事件:

stop_event.set()

线程会注意到,打破循环并死掉。

答案 1 :(得分:0)

使用全局变量作为线程停止的条件。

send_gcode = True

def printFile():
    def print_thread():
        f = open(entryBox2.get(), 'r');
        for line in f:
            if not send_gcode:
                break
            l = line.strip('\r')
            ser.write("<" + l + ">")
            while True:
                response = ser.read()
                if (response == 'a'):
                    break
    t = threading.Thread(target=print_thread)
    send_gcode = True
    t.start()

线程将一直运行,直到send_gcode设置为False(例如,按钮的回调:

def stop_callback(event):
    global send_gcode
    send_gcode = False