Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过按键来断开循环?_Python_Loops_For Loop_Tkinter_Pyautogui - Fatal编程技术网

Python 如何通过按键来断开循环?

Python 如何通过按键来断开循环?,python,loops,for-loop,tkinter,pyautogui,Python,Loops,For Loop,Tkinter,Pyautogui,我写了一个小程序,在messenger中为我发送垃圾邮件。但是如果我想停下来,我就停不下来。我试图将“try/except:KeyboardInterrupt”放在循环中,但没有用 我需要python以某种方式检查我是否按了某个键,以及是否按了该键来中断循环。我还知道Tkinter中有一个after()方法,我应该使用它而不是time.sleep,但我的尝试失败了。这是我的密码: from tkinter import * import time import pyautogui root =

我写了一个小程序,在messenger中为我发送垃圾邮件。但是如果我想停下来,我就停不下来。我试图将“try/except:KeyboardInterrupt”放在循环中,但没有用

我需要python以某种方式检查我是否按了某个键,以及是否按了该键来中断循环。我还知道Tkinter中有一个
after()
方法,我应该使用它而不是
time.sleep
,但我的尝试失败了。这是我的密码:

from tkinter import *
import time
import pyautogui

root = Tk()
root.title('Typer')
text_field = Text(root, height=20, width=40)
button = Button(text='----Start----')


def typer(event):
    text = text_field.get("1.0",END)
    time.sleep(5)
    for i in text.split(' '):  
        pyautogui.write(i)
        pyautogui.press('enter')


button.bind('<Button-1>', typer)

text_field.pack()
button.pack()
root.mainloop()

但是我仍然无法中断for循环

您应该首先添加一条语句,检查它是否仍在运行:

def typer(event):
    global running
    running = True
    text = text_field.get("1.0",END)
    time.sleep(5)
    for i in text.split(' '):
        if running == False: #Will break the loop if global variable is changed
            break
        pyautogui.write(i)
        pyautogui.press('enter')
然后有几个选项可供选择;您可以使用tkinter的绑定(仅在tkinter窗口中工作)

或:

我为这段简陋的代码道歉,但希望你能理解。
我还没有测试它,所以如果您有问题,请告诉我。

您应该首先添加一条语句,检查它是否仍在运行:

def typer(event):
    global running
    running = True
    text = text_field.get("1.0",END)
    time.sleep(5)
    for i in text.split(' '):
        if running == False: #Will break the loop if global variable is changed
            break
        pyautogui.write(i)
        pyautogui.press('enter')
然后有几个选项可供选择;您可以使用tkinter的绑定(仅在tkinter窗口中工作)

或:

我为这段简陋的代码道歉,但希望你能理解。
我还没有测试过,所以如果您有问题,请告诉我。

这是否回答了您的问题@jasonharper好吧,这不是一个真正的重复,因为OP说他不知道如何使用
.after()
。如果你想打破一个循环,你应该检查循环中的一些条件。但是在你的代码中没有这样的代码。你到底想如何停止循环?您想输入shell还是只需按任意键,还是在tkinter窗口中按某个键?@OffflufDragon 9我想通过按代码中指定的键来停止它,例如Esc这是否回答了您的问题@jasonharper好吧,这不是一个真正的重复,因为OP说他不知道如何使用
.after()
。如果你想打破一个循环,你应该检查循环中的一些条件。但是在你的代码中没有这样的代码。你到底想如何停止循环?您是想在shell中输入,还是只想按任意键,还是想在tkinter窗口中按某个键?@OffflufDragon 9我想通过按代码中指定的键来停止它,例如Esc谢谢!我并没有通过按键来阻止它,它看起来太复杂了,你们的建议没有帮助:(所以我添加了停止按钮并将其绑定到停止(事件)中,它对我有效!实际上没有:(它不起作用,以前我做过不好的测试,但无论如何,谢谢你,我会继续努力让它起作用。当按下按钮时,循环将继续工作,并在末尾停止函数调用。谢谢!我没有通过按键来阻止它,它似乎太复杂了,你的建议没有帮助:(所以我添加了stop按钮并将其绑定到stop(event)上,它对我起了作用!事实上不:(它不起作用,以前我做了糟糕的测试,但无论如何,谢谢你,我会继续努力让它起作用。当按下按钮时,循环将继续工作,并最终停止函数调用。)
root.bind("<Escape>", stop)

def stop(event):
    global running
    running = False
keyboard.on_press_key("Esc", stop)
def typer(event):
    text = text_field.get("1.0",END)
    time.sleep(5)
    for i in text.split(' '):
        if keyboard.is_pressed("Esc"): #Will break the loop if key is pressed
            break
        pyautogui.write(i)
        pyautogui.press('enter')