【问题标题】:Unused variable in PythonPython中未使用的变量
【发布时间】:2020-04-14 17:06:05
【问题描述】:

这是我第一次创建一个每两秒截屏的python程序。问题是我不知道如何打破 while 循环。我写的sscount不为零,继续截图。然后当用户按下 ESC 按钮时,将 sscount 设置为 0。这应该会停止 while 循环,但我会收到警告“未使用的变量 'sscount'”,并且它也不会停止 while 循环。

谁能帮帮我?谢谢。

import pynput
import pyautogui
import time

from pynput.keyboard import Key, Listener

count = 0

    def on_release(key):
        if key == Key.esc:
            sscount = 0 #this is where the warning comes.
            return False

    with Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()

    while sscount != 0:
        pyautogui.screenshot('/users/aliha/desktop/screenshot/image'+str(sscount)+'.png')
        sscount += 1
        time.sleep(2.0)

【问题讨论】:

  • 您必须使用全局变量sscount,并在on_release 中将其声明为global - 否则每次创建并丢弃一个新的局部变量。

标签: python


【解决方案1】:

下面有一个sn-p代码来增强。

  • is_runningTrue 时运行的主程序
  • ctrl+c 事件集 is_runningFalse
  • 如果在 2 个 <escape> 按键之间经过的时间超过 2 秒,则会截屏
  • 输出路径未硬编码
  • 全局变量用于共享状态
import time
from os.path import expanduser
from pathlib import Path
import datetime
from pynput.keyboard import Key, Listener, Controller


keyboard = Controller()
is_running = True
sscount = 0
previous_date = None
screenshot_dir = None

def on_press(key: Key):
    global previous_date, sscount
    have_to_take_screenshot = False
    current_date = datetime.datetime.now()
    if previous_date is None:
        previous_date = current_date
        have_to_take_screenshot = True
    else:
        elapsed_time = current_date - previous_date
        if elapsed_time > datetime.timedelta(seconds=2):
            previous_date = current_date
            have_to_take_screenshot = True
        else:
            have_to_take_screenshot = False

    print(have_to_take_screenshot)
    if have_to_take_screenshot and key == Key.esc:
        pyautogui.screenshot(f'{screenshot_dir}/image{sscount}.png')
        sscount+= 1


def on_release(key: Key):
    global screenshot_dir
    should_continue = True
    print(key)
    if key == Key.esc:
        is_running = False
        should_continue = False
    return should_continue


if __name__ == '__main__':
    home_dir = expanduser('~/')
    screenshot_dir = Path(f'{home_dir}/desktop/screenshot')

    if not screenshot_dir.exists():
        screenshot_dir.mkdir(parents=True, exist_ok=True)

    while is_running:
        try:
            with Listener(on_press=on_press, on_release=on_release) as listener:
                listener.join()
        except KeyboardInterrupt:
            is_running = False

【讨论】:

    【解决方案2】:

    为了能够全局使用变量 sscount 并在函数 on_release 中操作全局变量,您必须使用 global sscount 在函数中将 sscount 声明为全局变量。完整结果:

    def on_release(key):
        global sscount
        if key == Key.esc:
            sscount = 0 #this is where the warning comes.
            return False
    

    【讨论】:

      【解决方案3】:

      解决此问题的一种方法是引发StopIteration 并使循环无限。

      import pynput
      import pyautogui
      import time
      
      from pynput.keyboard import Key, Listener
      
      
          def on_release(key):
              if key == Key.esc:
                  raise StopIteration
      
          with Listener(on_press=on_press, on_release=on_release) as listener:
              listener.join()
      
          while True:
              pyautogui.screenshot('/users/aliha/desktop/screenshot/image'+str(sscount)+'.png')
              time.sleep(2.0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 2011-04-29
        • 2018-05-14
        • 1970-01-01
        相关资源
        最近更新 更多