在Python中的while循环中改变标志值的可能方法?

4

我的问题是这样的:我正在运行一个while循环,每次都会执行Function1,只有在它们各自的标志设置为True时,Function2和Function3才会被执行,而我希望能够在循环运行时修改这些标志

while brkFlag == False:  
    Function1.run()
    if flag2 == True:
        Function2.run()
    else:
        pass    
    if flag3 == True:
        Function3.run()
    else:
        pass
    if someConditions == True:
        brkFlag = True

我想在循环运行时使用tkinter的按钮和复选框来更改这些标志,但是迄今为止没有成功。

由于每个函数中都有大量计算并且需要实时显示结果,因此不能使用多线程或多进程,因为它们会显著降低循环速度(当前速度已经勉强可接受)。

编辑:看来除了使用多线程/处理之外别无选择了。


只是一点小提示...你实际上可以移除 else 代码块。 - Rakesh
是的,我知道,因为pass什么也不做。但是我可能会在将来添加一些内容,所以现在就这样留着吧。这就像一个格式。 - Bao Tran
1
不确定GUI方面,但您能在函数对象本身上设置一个“启用”标志吗?Function2.enabled = True。在循环中测试并在GUI中设置它?此外,我不知道您计划如何从GUI中“伸手进去”并更改循环的任何对象,除非GUI和循环都在同一进程中运行。这意味着线程。 - JL Peyret
1个回答

0
一种简单的方法是传递一个包含标志的可变容器,例如列表:
flags = [flag2, flag3, someConditions ]
while brkFlag == False:  
    Function1.run(flags)
    if flags[0] == True:
        Function2.run(flags)
    else:
        pass    
    if flags[1] == True:
        Function3.run(flags)
    else:
        pass
    if someConditions == True:     # or if flags[2] == True:
        brkFlag = True

在被调用的函数中,你会实现更多或更少的内容:
...
def run(flags):
    ...
    flags[0] = True    # set flag2
    ...

那么,当我的while循环正在运行时,我该如何更改该容器的值呢? - Bao Tran
没有人...我是说,有没有一种方法可以在不使用单独的线程/进程中断while循环的情况下更改这些标志?该循环实际上从相机获取实时图像帧并对其进行处理,因此我真的很想能够在不中断实时视频提供的情况下更改这些标志。如果我的程序变得比现在更慢,那么我将无法使用多线程/处理,因为它将毫无价值。 - Bao Tran
1
@BaoTran:看起来我没有理解你的观点...很遗憾,我真的不明白你的问题出在哪里。从GUI中更改变量通常是GUI的设计目的。常见的用法是一个线程用于GUI,可能还有一个或多个工作线程,在长时间操作期间保持GUI的响应性。唯一的限制是后台线程永远不应该对GUI进行操作。 - Serge Ballesta
是的,很抱歉,看来绕过使用多线程是不可能的了。我之前尝试过多线程,但相机的帧率会显著下降。不确定是我做错了什么还是多线程确实会普遍减慢Python程序的速度。感谢您对我的耐心等待。 - Bao Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接