在 python 中更改 while 循环中标志值的可能方法?

Possible ways to change flag values inside a while loop in python?

提问人:Bao Tran 提问时间:6/25/2018 最后编辑:Bao Tran 更新时间:6/26/2018 访问量:3535

问:

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

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

目前,我想在循环运行时使用 GUI 更改这些标志,并尝试使用 tkinter 的按钮和复选框来执行此操作,但到目前为止没有运气。

我也不能使用多线程或多处理,因为它们会大大减慢循环的速度(这已经是勉强可以接受的,因为每个函数中都有很多计算,我需要以实时方式显示结果)。

编辑:所以似乎除了做多线程/处理之外别无他法。

python 循环 while 循环 标志

评论

0赞 Rakesh 6/25/2018
只是一个旁注......您实际上可以删除该代码段else
0赞 Bao Tran 6/25/2018
是的,我知道,因为通行证什么也做不了。但是,我将来可能会添加一些东西,所以我暂时就这样吧。这就像一种格式。
1赞 JL Peyret 6/26/2018
不确定 GUI 方面,但您可以在函数对象本身上设置一个启用标志吗?Function2.enabled = True。在循环中测试并在 GUI 中设置它?另外,我不知道您打算如何从 GUI “进入”并更改循环的任何对象,除非 GUI 和循环都在运行,在同一进程中。这意味着线程。

答:

0赞 Serge Ballesta 6/25/2018 #1

一个简单的方法是传递一个包含标志的可变容器,例如列表:

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
    ...

评论

0赞 Bao Tran 6/25/2018
嗯,那么当我的 while 循环运行时,我该如何更改该容器的值?
0赞 Bao Tran 6/25/2018
没有人...我的意思是,有没有办法在不使用单独的线程/进程中断 while 循环的情况下更改这些标志?该循环实际上从摄像机中获取实时图像帧并对其进行处理,因此我真的很希望能够在不中断实时视频源的情况下更改这些标志。我不能使用多线程/处理,因为如果我的程序变得比现在慢,它将毫无价值。
1赞 Serge Ballesta 6/25/2018
@BaoTran:看来我错过了你的意思......不幸的是,恐怕我真的无法理解你的问题在哪里。从 GUI 更改变量,通常是 GUI 的用途。常见的用途是 GUI 的一个线程,最终是一个或多个工作线程,以保持 GUI 在长时间操作期间的响应。唯一的约束是后台线程不应作用于 GUI。
0赞 Bao Tran 6/26/2018
是的,对不起,似乎没有其他方法可以使用多线程。实际上,我之前尝试过多线程,但相机的帧速率会大大下降。不确定我是否做错了什么,或者多线程确实确实会减慢 python 程序的速度。谢谢你对我的耐心。