我正在尝试做一个键盘映射软件,它有一个按钮,它激活了按键映射,这基本上启动了一个线程调用一个函数,其中有一个有条件的while循环检查按键。但问题是,即使我使用按钮将全局变量设置为false,线程也不会终止,直到我按下键盘上的一个键。
这有点让人沮丧..当您认为按键映射已停用,但随后您尝试关闭软件或尝试激活另一个按键映射时,它会显示错误,并且只要您按下某个键键入某些内容,光标就会在屏幕上单击并弹出现在您的按键映射已停用.
这是我的代码...有什么建议吗?
键映射函数
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 = ''开/关按钮功能
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)发布于 2021-10-08 19:20:16
您没有说明您正在使用哪个GUI (是tkinter吗?),但是在大多数GUI中,按钮处理都是在GUI的事件循环中完成的,当事件发生时,它会调用代码上的回调,并且您的回调应该立即返回,以便事件循环可以继续处理更多事件。因此,如果回调包含阻止其立即返回的while循环,则GUI的事件处理代码将被阻止运行,因此不能/不能执行您期望它执行的事件处理任务。
解决方案是确保回调总是立即返回--尤其是,不要在回调中执行任何长度不定的while循环;而是将类中某些成员变量的状态设置为“记住”您正处于正在进行的事件中,这样以后的回调就可以检查这些成员变量,以便知道是否要做正确的事情。
https://stackoverflow.com/questions/69498329
复制相似问题