键盘中断后执行代码的问题

问题描述

我为这个 20x4 LCD 屏幕写了一个超级简单的东西,每当我用 crtl + c 中断而不是执行我放在那里的代码时,我就会不断得到这个。 这是错误

CTraceback (most recent call last):
  File "lcd/clock.py",line 25,in <module>
    sleep(1)
KeyboardInterrupt

这是代码

import drivers
from time import sleep
from datetime import datetime
from subprocess import check_output
display = drivers.Lcd()
display.lcd_backlight(0)
IP = check_output(["hostname","-I"]).split()[0]
usrinpt = input("Text: ")
while len(usrinpt) > 20:
        print("Too Long")
        usrinpt = input("Text: ")
else:
    display.lcd_backlight(1)
    print("Writing to display")
    while True:
        display.lcd_display_string(str(datetime.Now().time().strftime("%H:%M:%s")),1)
        display.lcd_display_string(str(IP),2)
        display.lcd_display_string(str("____________________"),3)
        sleep(1)
        display.lcd_display_string(str(datetime.Now().time().strftime("%H:%M:%s")),2)
        display.lcd_display_string(str(usrinpt),3)
        sleep(1)

        if KeyboardInterrupt:
    # If there is a KeyboardInterrupt (when you press ctrl+c),turn off backlights
            display.lcd_backlight(0)

先谢谢你!我认为这可能是一个非常简单的修复,但遗憾的是我仍然是一个完整的新手。

解决方法

而不是使用 if 语句...

if KeyboardInterrupt:
    # If there is a KeyboardInterrupt (when you press ctrl+c),turn off backlights
    display.lcd_backlight(0)

使用 try / except 语句,用于检查错误(按 CTRL+C 会产生 KeyboardInterrupt 错误):

try:
    display.lcd_backlight(1)
    print("Writing to display")
    while True:
        display.lcd_display_string(str(datetime.now().time().strftime("%H:%M:%S")),1)
        display.lcd_display_string(str(IP),2)
        display.lcd_display_string(str("____________________"),3)
        sleep(1)
        display.lcd_display_string(str(datetime.now().time().strftime("%H:%M:%S")),2)
        display.lcd_display_string(str(usrinpt),3)
        sleep(1)
except KeyboardInterrupt:
    # If there is a KeyboardInterrupt (when you press ctrl+c),turn off backlights
    display.lcd_backlight(0)
,

问题是因为您在运行 sleep(1) 时按下了 Ctrl + C。由于您只是在睡眠后检查键盘中断,因此 Python 不会正常检查异常和错误。您可以使用 try... except...:

修复它
while True:
    try:
        display.lcd_display_string(str(datetime.now().time().strftime("%H:%M:%S")),3)
        sleep(1)
    except KeyboardInterrupt:
        display.lcd_backlight(0)

在这里,它将继续运行代码,直到遇到 KeyboardInterrupt,它将执行 display.lcd_backlight(0)