Python 使用tkinter输入绑定停止正在运行的函数

Python 使用tkinter输入绑定停止正在运行的函数,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,警告:使用单击功能运行下面的代码会使光标处于循环中,从而使程序无法停止 我正在尝试制作一个自动化程序,它接受一个文本文件并根据文本文件运行一个宏。 其思想是,您只需按下键绑定(在本例中为q),然后执行操作,但在尝试添加无限循环选项(目前缺少适当的UI,只能通过shell中的编辑访问)时,需要一种方法来通知函数(run)停止运行。我的计划是使用bool函数(greenligth)来阻止代码运行,我认为这有点奇怪,所以当我在代码运行时按q键时,它会停止运行,但是在尝试这样做时,它只会使windows

警告:使用单击功能运行下面的代码会使光标处于循环中,从而使程序无法停止

我正在尝试制作一个自动化程序,它接受一个文本文件并根据文本文件运行一个宏。 其思想是,您只需按下键绑定(在本例中为q),然后执行操作,但在尝试添加无限循环选项(目前缺少适当的UI,只能通过shell中的编辑访问)时,需要一种方法来通知函数(run)停止运行。我的计划是使用bool函数(
greenligth
)来阻止代码运行,我认为这有点奇怪,所以当我在代码运行时按q键时,它会停止运行,但是在尝试这样做时,它只会使windows u无法执行此声音,程序会继续运行。下面的代码,很抱歉我对Python和英语两种语言的理解都很糟糕

正在馈送的.txt文件(
data.txt
)为

这是一个不错的自动点击器,但这不是我想要的。 另外,在greenligth==true时去掉
,并降低运行中的所有缩进,以正确地查看代码如何工作,而不会在尝试修复时出现混乱

import pyautogui
import time
import keyboard
import random
import win32api, win32con
from tkinter import *
import re


loopbool = False
running = False
greenlight = False



File = open("data.txt", "r")
if File.mode == "r":
    myfile =File.read()

def Convert(string):
    li = list(string.split(" "))
    li = list(string.split("\n"))
    return li

def Click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

def Wait(x):
    print(x)
    time.sleep(x)

def DragClick(x,y,t):
    pyautogui.dragTo(x, y, t)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

def PressKey(key_name):
    pyautogui.keyDown(key_name)
    pyautogui.keyUp(key_name)

def LoopCheck(debug=None):
    print(debug)
    global running
    global loopbool
    global greenlight
    print("here")
    if loopbool == True and running == False:

        while 1 == 1 and greenlight == True:
            print("while loop")
            run()
            running = True
        
    elif loopbool == False and running == False:
        print("running not in loop")
        greenlight = True
        running = True
        run()
    

    else :
        print("Off")
        greenligth = False

    
    
        




    
def run(debug=None):
    print(debug)

    instruccions = Convert(myfile)
    loop = 0
      #testing some shit with loop shenanigans
    while greenlight == True:
        for x in instruccions:
            if  "1" in x or "2" in x or "3" in x or "4" in x or "5" in x or "6" in x or "7" in x or "8" in x or "9" in x or "0" in x:
                x = list(x.split(","))
                if x[0] == "CL":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    Click(xcords,ycords)
                elif x[0] == "ST":
                    TimeS = (int(x[1]))
                    Wait(TimeS)
                elif x[0] == "DC":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    timeS = (int(x[3]))
                    DragClick(xcords,ycords,timeS)
                elif x[0] == "MC":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    timeD = (int(x[3]))
                    pyautogui.dragTo(xcords, ycords, timeD)

          

            
        
            elif "1" not in x:
                x = list(x.split(","))
                if x[0] == "CL":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
                elif x[0] == "PK":
                    for y in x[1]:
                        z = (x[1])
                        print(z)
                        #PressKey(x)
                        pyautogui.keyDown(z)
                        pyautogui.keyUp(z)

                elif x[0] == "KU":
                    z = (x[1])
                    pyautogui.keyUp(z)
           
                elif x[0] == "KD":
                    z = (x[1])
                    pyautogui.keyDown(z)    
                    
                elif x[0] == "MU":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

                elif x[0] == "MD":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)

                else :
                    print(x[0])
                    
                    
    else:
        return()
          





File.close


window = Tk()

window.title("pain")

window.geometry('350x200')
#widgets
label = Label(window, text="fuck off")
label.grid(column=0, row=0)

button = Button(window, text="Click Me")
button = Button(window, text="Click Me", command=LoopCheck)
button.bind('<Enter>',LoopCheck)
button.grid(column=1, row=0)
#other shit
window.bind('q',LoopCheck)


window.mainloop()




导入pyautogui
导入时间
输入键盘
随机输入
导入win32api、win32con
从tkinter进口*
进口稀土
loopbool=False
运行=错误
绿灯=假
文件=打开(“data.txt”、“r”)
如果File.mode==“r”:
myfile=File.read()
def转换(字符串):
li=列表(string.split(“”)
li=列表(string.split(“\n”))
返回李
def单击(x,y):
win32api.SetCursorPos((x,y))
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
睡眠时间(0.1)
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTUP,0,0)
def等待(x):
打印(x)
时间。睡眠(x)
def DragClick(x,y,t):
pyautogui.dragTo(x,y,t)
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
睡眠时间(0.1)
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTUP,0,0)
def按键(按键名称):
pyautogui.keyDown(键名称)
pyautogui.keyUp(键名称)
def LoopCheck(调试=无):
打印(调试)
全球运行
全局环布尔
全球绿灯
打印(“此处”)
如果loopbool==True且running==False:
当1==1且绿灯==True时:
打印(“while循环”)
运行()
运行=真
elif loopbool==False和running==False:
打印(“不在循环中运行”)
绿灯=真
运行=真
运行()
其他:
打印(“关闭”)
格林利兹=假
def运行(调试=无):
打印(调试)
指令=转换(myfile)
循环=0
#用恶作剧测试一些狗屎
而绿灯==真:
对于说明中的x:
如果x中的“1”或x中的“2”或x中的“3”或x中的“4”或x中的“5”或x中的“6”或x中的“7”或x中的“8”或x中的“9”或x中的“0”:
x=列表(x.split(“,”))
如果x[0]=“CL”:
xcords=(int(x[1]))
ycords=(int(x[2]))
单击(XWord、YWord)
elif x[0]=“ST”:
时间=(int(x[1]))
等待(次)
elif x[0]=“DC”:
xcords=(int(x[1]))
ycords=(int(x[2]))
时间=(int(x[3]))
DragClick(xWord、yWord、timeS)
elif x[0]=“MC”:
xcords=(int(x[1]))
ycords=(int(x[2]))
timeD=(int(x[3]))
pyautogui.dragTo(xwords、ycords、timeD)
elif“1”不在x中:
x=列表(x.split(“,”))
如果x[0]=“CL”:
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTUP,0,0)
elif x[0]=“主键”:
对于x[1]中的y:
z=(x[1])
打印(z)
#按键(x)
pyautogui.keyDown(z)
pyautogui.keyUp(z)
elif x[0]=“KU”:
z=(x[1])
pyautogui.keyUp(z)
elif x[0]=“KD”:
z=(x[1])
pyautogui.keyDown(z)
elif x[0]=“MU”:
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTUP,0,0)
elif x[0]=“MD”:
win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
其他:
打印(x[0])
其他:
返回()
File.close
window=Tk()
窗口标题(“痛苦”)
窗口几何(“350x200”)
#小部件
标签=标签(窗口,text=“滚开”)
label.grid(列=0,行=0)
按钮=按钮(窗口,text=“单击我”)
按钮=按钮(窗口,text=“单击我”,命令=循环检查)
按钮绑定(“”,循环检查)
button.grid(列=1,行=0)
#其他狗屎
window.bind('q',LoopCheck)
window.mainloop()

请将此代码减少到一个最小值。
import pyautogui
import time
import keyboard
import random
import win32api, win32con
from tkinter import *
import re


loopbool = False
running = False
greenlight = False



File = open("data.txt", "r")
if File.mode == "r":
    myfile =File.read()

def Convert(string):
    li = list(string.split(" "))
    li = list(string.split("\n"))
    return li

def Click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

def Wait(x):
    print(x)
    time.sleep(x)

def DragClick(x,y,t):
    pyautogui.dragTo(x, y, t)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

def PressKey(key_name):
    pyautogui.keyDown(key_name)
    pyautogui.keyUp(key_name)

def LoopCheck(debug=None):
    print(debug)
    global running
    global loopbool
    global greenlight
    print("here")
    if loopbool == True and running == False:

        while 1 == 1 and greenlight == True:
            print("while loop")
            run()
            running = True
        
    elif loopbool == False and running == False:
        print("running not in loop")
        greenlight = True
        running = True
        run()
    

    else :
        print("Off")
        greenligth = False

    
    
        




    
def run(debug=None):
    print(debug)

    instruccions = Convert(myfile)
    loop = 0
      #testing some shit with loop shenanigans
    while greenlight == True:
        for x in instruccions:
            if  "1" in x or "2" in x or "3" in x or "4" in x or "5" in x or "6" in x or "7" in x or "8" in x or "9" in x or "0" in x:
                x = list(x.split(","))
                if x[0] == "CL":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    Click(xcords,ycords)
                elif x[0] == "ST":
                    TimeS = (int(x[1]))
                    Wait(TimeS)
                elif x[0] == "DC":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    timeS = (int(x[3]))
                    DragClick(xcords,ycords,timeS)
                elif x[0] == "MC":
                    xcords = (int(x[1]))
                    ycords = (int(x[2]))
                    timeD = (int(x[3]))
                    pyautogui.dragTo(xcords, ycords, timeD)

          

            
        
            elif "1" not in x:
                x = list(x.split(","))
                if x[0] == "CL":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
                elif x[0] == "PK":
                    for y in x[1]:
                        z = (x[1])
                        print(z)
                        #PressKey(x)
                        pyautogui.keyDown(z)
                        pyautogui.keyUp(z)

                elif x[0] == "KU":
                    z = (x[1])
                    pyautogui.keyUp(z)
           
                elif x[0] == "KD":
                    z = (x[1])
                    pyautogui.keyDown(z)    
                    
                elif x[0] == "MU":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

                elif x[0] == "MD":
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)

                else :
                    print(x[0])
                    
                    
    else:
        return()
          





File.close


window = Tk()

window.title("pain")

window.geometry('350x200')
#widgets
label = Label(window, text="fuck off")
label.grid(column=0, row=0)

button = Button(window, text="Click Me")
button = Button(window, text="Click Me", command=LoopCheck)
button.bind('<Enter>',LoopCheck)
button.grid(column=1, row=0)
#other shit
window.bind('q',LoopCheck)


window.mainloop()