# 从这里开始看，我相信，不包含修补的部分，一天时间应该是能理解全部内容的
# 如果不知道我本来不想写类的，但是后来发现全局变量太多了，然后一些文件间的调用也会冲突，所以把一大堆散的函数放进了两个类里。
# 简单说一下什么是类，我的理解就是一堆参数和函数的集合，这些参数和函数是包含在这个类中的。类实例化得到对象。有兴趣可以百度一下类和面向对象。
# 程序包含三个部分，这个是main也就是主函数，是程序的入口。
# 另外有两个类：一个是cvImg类，包含了所有的图像处理工作；还有一个是gui类，包含了交互界面，字符串处理和多线程控制
# 这个程序一共有四个并行的线程：GUI线程，图像处理线程，matlab信号监听线程，心电信号监听线程

# 好那么我们开始吧！
# 首先是下面这两行，他们的作用是为调用库函数做准备，python的强大之处有一点就是网上有大量的大佬们写好的库可以用
# 调用库有三种方式：import queue;from queue import *;from scipy import stats
# 如果用第一种方式，那么这个叫queue的库里面的东西，你用的时候需要写“queue.”然后后面再加这个库里的函数名字或者类的名字
# 如果用第二种方式，那么就是queue里面所有的东西都可以直接用，函数名或类名之前不用加“queue.”
# 如果用第三种方式，那么就是指定库里面的一个类或函数，拿出来用。这里就是把scipy这个包里面的stats类拿出来用

# 调用的可以是python的库，也可以是我自己写的文件，比如下面第一行，就是把我写的gui.py这个文件里的类调用过来
# 在这个pycharm软件里面，像第二行的queue和time是灰色的，意思就是没用用上，可以删掉。可能是在别的调用的文件里面重复了。
from gui import *
import queue, threading, time

# 下面这行是声明全局变量，这个两个全局变量在调用了本文件的其他文件中也可以使用。我用类就是因为发现全局变量太tm多了，现在少很多了。
global root, threads


# 主流程，第一行这个if，就是主程序入口。
if __name__ == '__main__':
# 这个Tk是python自带的一个库tkinter里面的东西。它的作用是新建一个弹框，我们后面的gui操作都是在这个弹框上进行的。
    root = Tk()
# 这句话就是给gui这个类实例化了，类本身不太好直接用（如果有静态方法是可以直接用的，这里没用到就不说），类的使用都是把它实例化成一个对象
# 比如这里，类是gui，对象是main_ui，root是类实例化时需要的一个参数，这个root就是上面这个root，可以理解为这个弹框的名字时root
    main_ui = gui(root)
# 接下来三行时开启一个线程，这个线程时控制gui的
# 第一行的作用是定义线程，t_gui就是这个线程的名字，threading.Thread就是threading这个库里面，使用Thread这个类。把Thread类实例化成t_gui这个对象
# 一个线程启动，那它得做事情吧。第一件事情就是这个target=，后面写的东西就是这个线程要执行的函数。
# root.mainloop()就是gui启动的意思，具体解释的话就是说：root是Tk这个类实例化的对象，也就是弹框的名字，mainloop就是root这个对象里面的一个方法
# mainloop的意思是主循环开始，可以理解为gui界面是一直不断在刷新的，我们所做的按键、选择、输入、打印等操作，都是一次一次刷新出来的
    t_gui = threading.Thread(target=root.mainloop())
# t_gui是Thread这个类实例化的对象，setDaemon这个函数的意思是“守护线程”，不要让子线程影响主线程。
    t_gui.setDaemon(True)
# start函数也是t_gui这个对象里有的函数，功能是开始这个函数
    t_gui.start()
