python GUI 多线程 暂停 恢复 结束

  • Post author:
  • Post category:python


本人自行学 python 完全是网络教程 很多没有费解地方也没人交流 见谅

找了很多 多线程相关 发现都是没 使用在窗口

最多就是

t=threading.Thread()

t.start()

join 使用完全么有效果 使用必崩溃

也想过 用ctypes 弄成 易语言 那样简单调用 可是没反应

这个方式写比较麻烦 要用类分方式写 才能完全做到

循环方式 还必须是 while 如果 使用for 是无法 暂停 恢复 停止的

此 gui 适应也与 tkinter & PySimpleGUI 两者相同
在这里插入图片描述

在这里插入图片描述

// An highlighted block
#!/usr/bin/python3
import threading
from threading import Thread #线程 多用于 开关密集型 
import time 
import PySimpleGUI as sg
from multiprocessing import Process  #进程 多计算密集型 消耗的是计算机算力

class Mythrand(Thread):
    def __init__(self,*args,**kwargs):
        super(Mythrand, self).__init__(*args,**kwargs)
        self.__flag=threading.Event() #设置暂停标识
        self.__flag.set() 
        self.__running = threading.Event()  #设置停止标识
        self.__running.set()
        
    def run(self):
        i=0
        while self.__running.is_set(): #接收停止的信号self.__running.is_set() 此时信号为 True ,True,True
            self.__flag.wait() #接收 暂停 和 恢复信号
            i+=1
            print('线程中...',i)
            time.sleep(1)
    def pause(self):#暂停线程
        self.__flag.clear()
    def resume(self):# 恢复线程
        self.__flag.set() #先唤醒暂停的线程
    def stop(self): #结束线程
        self.__flag.set() #先唤醒暂停的线程
        self.__running.clear() #self.__running.is_set() 此时信号为 False,  False,  False

def the_gui():
    sg.theme('Light Brown 3')
    layout = [[sg.Text('执行示例的长任务')],
              [sg.Output(size=(70, 12))],
              [sg.Button('开始'),sg.Button('挂起'),sg.Button('恢复'), sg.Button('结束'), sg.Button('Exit')], ]

    window = sg.Window('Multithreaded Window', layout)

    # --------------------- EVENT LOOP ---------------------
    while True:
        event, values = window.read()
        if event in (sg.WIN_CLOSED, 'Exit'):
            break
        elif event=='开始':
            t=Mythrand()
            t.start()
            print('启动线程')

        elif event == '挂起':
            t.pause() #可能高亮不要紧可以执行
            print('挂起线程')
        elif event == '恢复':
            t.resume()
            print('恢复线程')

        elif event == '结束':
            t.stop()
            print('结束线程')

    window.close()



if __name__ == '__main__':
	#方式1
	the_gui
	#方式2
    #hwnd=threading.Thread(target=the_gui)
    #hwnd.start()
    #方式3
	#hwnd=Process(target=the_gui)
	#hwnd.start()



版权声明:本文为wangyunhe5120原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。