Python&Tkinter:来自多个类的多处理

2024-03-29 01:56:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Tkinter项目,有八节课。其中6个类是页面,因此GUI的每个页面都有自己的类。我需要设置跨类的多处理,我需要进程同时加入。下面是一个类和我的多处理设置的示例:

class Page1(Page):
    def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       #setting up gas varible to read from
       self.gas = minimalmodbus.Instrument("COM3", 1)
       self.gas.serial.baudrate = 9600
       self.gas.serial.bytesize = 8
       self.gas.serial.parity = serial.PARITY_NONE
       self.gas.serial.stopbits = 1
       self.gas.serial.timeout = 0.25
       self.gas.mode = minimalmodbus.MODE_RTU

       self.timer_button = tk.Button(self, text='Start', command=self.toggle)
       self.timer_button.pack(side="top")

    def toggle(self):
            all_thread(self.gas)

def all_thread(a_gas):
    thread = threading.Thread(target=all_process(a_gas))

def all_process(a_gas):
    gas_list = []
    gas_list.append(a_gas)
    processes = []
    while len(gas_list) > 0:
        for sen in gas_list:
            proc = Process(target=main_reader(sen))
            processes.append(proc)
            proc.start()
        for sen in processes:
            sen.join()
        time.sleep(1)

def main_reader(gas_num):
    read = gas_num.read_registers(0,42)
    print(read)

这样,我就可以在控制台中获得我想要的所有输出。但是,当我按下timer_button时,我的GUI冻结并崩溃。我在正确的轨道上吗/我做错了什么?在


Tags: selfreaddefserialguibutton页面proc
1条回答
网友
1楼 · 发布于 2024-03-29 01:56:50

此代码:

thread = threading.Thread(target=all_process(a_gas))

。。。与此代码完全相同:

^{pr2}$

您没有在线程中运行该命令,这就是程序冻结的原因。必须为目标分配一个可调用。如果需要传递参数,请使用args

thread = threading.Thread(target=all_process, args=(a_gas,))

所有这些都在python文档中记录。见https://docs.python.org/2/library/threading.html#threading.Thread

当你开始一个过程时,你也会遇到同样的问题。在

这个:

proc = Process(target=main_reader(sen))

。。。与此完全相同:

result = main_reader(sen)
proc = Process(target=result)

所以,就像你不用线程一样,你也不用进程。同样,这一切都有记录:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process

相关问题 更多 >