首页 > 解决方案 > 在程序运行时更改值

问题描述

我需要一个树莓派上的程序,我可以 delay在程序运行时更改变量的值,并且不会被任何input(). 我只想出了一个解决方案:从文本文件中读取一个值并使用另一个程序更改它。但是我的解决方案效果不佳...当我覆盖文本文件中的值时,有时会发生程序无法将其转换为浮点数...有时效果很好,有时会打印此错误:

ValueError: could not convert string to float: ''

但是文本文件中的值似乎很好......

所以,这是主程序:

def pause():
    file = open('delay.txt', 'r')
    pause = file.readline()
    return pause
    
delay = float(pause())

while True:
    GPIO.output(STEP, GPIO.HIGH)
    delay = float(pause())
    sleep(delay)
    GPIO.output(STEP, GPIO.LOW)
    delay = float(pause())
    sleep(delay)

这是程序,它正在改变文本文件中的值:

while True:
    rpm = float(input('RPM: '))

    delay = (1/(rpm*60))/800
    file = open('delay.txt', 'w')
    file.write(str(delay))
      
    file.close()

我真的无法接受这个......我将不胜感激任何建议和帮助解决它。您不必用文本文件坚持我的想法,也许有更好的解决方案,但我想不出更好的办法。

标签: python

解决方案


我建议您为此使用线程。我为您制作了一个小代码示例来帮助您入门:

import threading
from time import sleep
import logging

logging.basicConfig(level=logging.DEBUG, filename="thread_output.txt", format='%(asctime)s %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s')

running = True
delay = 1

def worker(delay, running):
  while running():
    logging.debug(1)
    sleep(delay())
    logging.debug(0)
    sleep(delay())

x = threading.Thread(target=worker, args=(lambda: delay, lambda: running))
x.start()

while running:
    code = input("""
    Make a choice:
      1) Set delay
      2) quit
    """)
    code = int(code)
    if code == 1:
        try:
            val = input("Give up the desired delay between 0 and 10 seconds:")
            val = int(val)
            assert val >= 0 and val <= 10 
            delay = val
        except ValueError:
            print("Invalid input! Returning to home menu")
            continue
    elif code == 2:
        running = False
    else:
        print("invalid option! Returning to home menu")
        continue

print("quiting...")
x.join()

在这里对您有帮助的部分是您将延迟的值(在示例中还包括运行)作为 lambda 函数传递。这意味着每次使用该值时,都会重新获取该值。如果您随后要更改变量的值,它将被传递:)

如果您有更多问题,请联系我!


推荐阅读