首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在制作一个软件,其中有一个线程,按下按钮启动。但我不能停止它,即使它在条件while循环下

我正在制作一个软件,其中有一个线程,按下按钮启动。但我不能停止它,即使它在条件while循环下
EN

Stack Overflow用户
提问于 2021-10-08 15:30:22
回答 1查看 28关注 0票数 0

我正在尝试做一个键盘映射软件,它有一个按钮,它激活了按键映射,这基本上启动了一个线程调用一个函数,其中有一个有条件的while循环检查按键。但问题是,即使我使用按钮将全局变量设置为false,线程也不会终止,直到我按下键盘上的一个键。

这有点让人沮丧..当您认为按键映射已停用,但随后您尝试关闭软件或尝试激活另一个按键映射时,它会显示错误,并且只要您按下某个键键入某些内容,光标就会在屏幕上单击并弹出现在您的按键映射已停用.

这是我的代码...有什么建议吗?

键映射函数

代码语言:javascript
复制
def keymapping():
    
    tree.bind('<Return>',func=lambda event=None:())
    
    global active
    global keymapping_running
    global x_cor
    global y_cor
    global start_range
    global end_range
    global selected
    global selected_iid
    global keymap_name
    
    keymapping_running = True
    
    while active:
        
        key = str(keyboard.read_key()).capitalize()
        
        x = int(str(mouse.get_position()).split('(')[1].split(',')[0])
        y = int(str(mouse.get_position()).split(')')[0].split(', ')[1])
                
        for i in saves[start_range+1:end_range+1]:
            i = str(i).split(" = ")
            if i[0] == key:
                x_cor = int(i[1].split(',')[0])
                y_cor = int(i[1].split(',')[1])
        
        if x_cor and y_cor: 
            
            mouse.move(x_cor-x,y_cor-y,absolute=False,duration=0.01)
            mouse.click('left')
    
            x_cor = 0
            y_cor = 0
            
        else:
            if keyboard.is_pressed('F9'):
                button_switch()
            
            elif keyboard.is_pressed('return'):
                
                if keyboard.is_pressed('return'):
                    pass
                
                if tree.selection() == ():
                    pass
                else:
                    app.wm_attributes("-topmost", 1)
                    tmsg.showerror("Already running",f"\'{keymap_name}\' is already running.")
                    app.wm_attributes("-topmost", 0)
            
            else:
                pass
                        
    tree.bind('<Return>',func=lambda event=None:button_switch())

    keymapping_running = False
    x_cor = 0
    y_cor = 0
    selected = ''
    selected_iid = ''
    app.wm_attributes("-topmost", 1)
    tmsg.showinfo("Keymapping Deactivated",f"\'{keymap_name}\' has been deactivated")
    app.wm_attributes("-topmost", 0)
    keymap_name = ''

开/关按钮功能

代码语言:javascript
复制
def button_switch():
    
    global active
    global keymap_name
    global selected
    global selected_iid
    
    if active:
        tree.item(selected,image=close_img)
        
        active_btn.config(image=on_img)
        active_btn_lbl.config(text='  Activate Keymapping  ')
        active = False
        
    else:
        
        if (not keymapping_running):
            
            if keymap:
                
                selected = tree.focus()
                
                if selected != '':
                    
                    selected_iid = tree.selection()
                    
                    if len(selected_iid) == 1:
                        
                        try:   
                            keymap_name = tree.item(selected,'values')[0]
                            for j in saves:
                                if str(j).split(' :- ')[0] == str(already_keymap_names[int(str(selected_iid).split(",")[0].split("'")[1])]).split(" :- ")[0]:
                                    global start_range
                                    start_range = saves.index(j) 
                                    global end_range
                                    end_range = start_range + int(str(saves[start_range]).split(" :- ")[1].split('(')[1].split(')')[0])     
            
                            active = True 
                            active_btn.config(image=stop_img)
                            tree.item(selected,image=done_img)
                            active_btn_lbl.config(text='Deactivate Keymapping')
                                                   
                            th = threading.Thread(target=keymapping)
                            th.start()
                            
                            tree.selection_remove(tree.focus())
                            
                            app.wm_attributes("-topmost", 1)
                            tmsg.showinfo("Keymapping Activated",f"\'{keymap_name}\' has been activated")
                            app.wm_attributes("-topmost", 0)
                        
                        except Exception as e:
                            print(e)
                            app.wm_attributes("-topmost", 1)
                            tmsg.showerror("Tampering",f"There has been tampering with the \'Saved_Keymappings.dll\' and we are unable to fetch \'{keymap_name}\'")
                            app.wm_attributes("-topmost", 0)
                    
                    elif len(selected_iid) == 0:
                        app.wm_attributes("-topmost", 1)
                        tmsg.showerror('Nothing selected','Please select a keymapping to activate.')
                        app.wm_attributes("-topmost", 0)
                    
                    else:
                        app.wm_attributes("-topmost", 1)
                        tmsg.showerror("Multiple Selected","You can't run multiple Keymappings together.")
                        app.wm_attributes("-topmost", 0)
                
                else:
                    app.wm_attributes("-topmost", 1)
                    tmsg.showerror('Nothing selected','Please select a keymapping to activate.')
                    app.wm_attributes("-topmost", 0)
            
            else:
                app.wm_attributes("-topmost", 1)
                tmsg.showerror("Nothing to Activate","You have no saved keymappings to activate.\n\nPlaese create a new keymapping before Activating")
                app.wm_attributes("-topmost", 0)
                
        else:
            app.wm_attributes("-topmost", 1)
            tmsg.showerror("Already running",f"\'{keymap_name}\' is already running.")
            app.wm_attributes("-topmost", 0)
EN

回答 1

Stack Overflow用户

发布于 2021-10-08 19:20:16

您没有说明您正在使用哪个GUI (是tkinter吗?),但是在大多数GUI中,按钮处理都是在GUI的事件循环中完成的,当事件发生时,它会调用代码上的回调,并且您的回调应该立即返回,以便事件循环可以继续处理更多事件。因此,如果回调包含阻止其立即返回的while循环,则GUI的事件处理代码将被阻止运行,因此不能/不能执行您期望它执行的事件处理任务。

解决方案是确保回调总是立即返回--尤其是,不要在回调中执行任何长度不定的while循环;而是将类中某些成员变量的状态设置为“记住”您正处于正在进行的事件中,这样以后的回调就可以检查这些成员变量,以便知道是否要做正确的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69498329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档