Python如何在循环中证明布尔表达式并在单击按钮时取消循环

Posted

技术标签:

【中文标题】Python如何在循环中证明布尔表达式并在单击按钮时取消循环【英文标题】:Python how to proof a boolean expression in a loop and cancel loop when button clicked 【发布时间】:2015-11-21 17:22:36 【问题描述】:

您好,我有一个带有函数“startAutomation”的 Python 程序,在这个函数中我有循环:

for i,j in zip(int_datadelta, int_timedelta):
  Att1.SetAttenuation(i) # Set attenuation
  print('Set Attenuation: ',i)
  lcd.display(i)
  time.sleep(j)

我有 4 个按钮“开始”、“停止”、“暂停”和“继续”。我可以使用“开始”按钮启动“startAutomation”功能,但其他按钮我无法使用。我需要一些东西来检查循环(布尔值),如果单击“停止”,循环应该停止;单击“暂停”时,只要单击“继续”按钮或单击“停止”时单击或中止按钮,循环就应该暂停。 到目前为止,这是我的代码:

# start button
def startAutomation(self, lcd, browse_le, rssi_le, add_le, *btns):
  int_timedelta =[]
  int_datadelta =[]
    for i,j in zip(int_datadelta, int_timedelta):
      Att1.SetAttenuation(i) # Set attenuation
      print('Set Attenuation: ',i)
      lcd.display(i)
      time.sleep(j)

def parsed():    
  btn3 = QtWidgets.QPushButton('Start')
  btn4 = QtWidgets.QPushButton('Stop')
  btn10 = QtWidgets.QPushButton('Pause')
  btn11 = QtWidgets.QPushButton('Continue')
  btn3.clicked.connect(functools.partial(self.startAutomation, lcd, le, le4, le5, rbtn, rbtn2, rbtn3))
  btn4.clicked.connect(functools.partial(self.stopAutomation))
  btn10.clicked.connect(functools.partial(self.pauseAutomation))
  btn11.clicked.connect(functools.partial(self.continueAutomation))
  hbox3.addWidget(btn3)
  hbox3.addWidget(btn4)
  hbox3.addWidget(btn10)
  hbox3.addWidget(btn11)      
  ...
  return vbox

# stop button
def stopAutomation(self):
    print ("Stop")

# pause button
def pauseAutomation(self):
  print ("Pause")

# continue button
def continueAutomation(self):
    print ("Continue")

我在 while 循环中尝试了几件事,但我无法让它工作。如果有人可以提供帮助会很高兴?

【问题讨论】:

旁注,您应该始终使用 4 个空格进行缩进,这样读起来更清楚。 startAutomation 中的 *btns 是否意味着您的“停止”、“暂停”、“继续”按钮?你的代码使用了我们看不到的地方定义的东西 【参考方案1】:

您可以创建一个函数来设置并返回一个包含最后按下按钮的字符串的变量,并对变量的值进行操作。

def lastPressed(self, what, last_pressed):
    if what == 'set':
        self.last_pressed = last_pressed
    elif what == 'get':
        return self.last_pressed
# start button
def startAutomation(self, lcd, browse_le, rssi_le, add_le, *btns):
    self.lastPressed('set', "Start")
    int_timedelta =[]
    int_datadelta =[]
        for i,j in zip(int_datadelta, int_timedelta):
            last_pressed = self.lastPressed('get', None)
            if  last_pressed == 'Start':
                Att1.SetAttenuation(i) # Set attenuation
                print('Set Attenuation: ',i)
                lcd.display(i)
                time.sleep(j)
            elif  last_pressed == 'Stop':
                ...
            elif  last_pressed == 'Pause':
                ...
            elif  last_pressed == 'Continue':
                ...
def parsed():    
    btn3 = QtWidgets.QPushButton('Start')
    btn4 = QtWidgets.QPushButton('Stop')
    btn10 = QtWidgets.QPushButton('Pause')
    btn11 = QtWidgets.QPushButton('Continue')
    btn3.clicked.connect(functools.partial(self.startAutomation, lcd, le, le4, le5, rbtn, rbtn2, rbtn3))
    btn4.clicked.connect(functools.partial(self.stopAutomation))
    btn10.clicked.connect(functools.partial(self.pauseAutomation))
    btn11.clicked.connect(functools.partial(self.continueAutomation))
    hbox3.addWidget(btn3)
    hbox3.addWidget(btn4)
    hbox3.addWidget(btn10)
    hbox3.addWidget(btn11)      
    ...
    return vbox
# stop button
def stopAutomation(self):
    self.lastPressed ('set', "Stop")

# pause button
def pauseAutomation(self):
    self.lastPressed ('set', "Pause")

# continue button
def continueAutomation(self):
    self.last_pressed ('set', "Continue")

【讨论】:

嘿利奥非常感谢!我也尝试实现“暂停”和“继续”功能,但它不起作用。我将发布循环以及我所做的事情。也许您知道缺少什么或如何实现它?我会喜欢它。 @Rafa 你只需要在他的 while 循环中添加一行 while True: last_pressed = self.lastPressed('get', None) ti.sleep(1) if last_pressed == 'Continue':休息

以上是关于Python如何在循环中证明布尔表达式并在单击按钮时取消循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在不单击tkinter python的情况下读取单选按钮值

Javascript/Python - 单击网站上的按钮并在 python 中运行函数

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段

Python_循环表达式

Python如何从命令按钮传递var / value并在if中使用它

Go语言循环判断的使用~