问题描述
尝试制作一个热键(例如Shift + d
)来打开或关闭事件。
有两个输入框。最上面的有你想说的单词或短语。底部是每次说出单词/短语之间的冷却时间。现在它被设置为当点击“输入”按钮时,它会立即开始在冷却时间内输入短语。
我希望这样当“输入”按钮被点击时,它不会开始输入,直到你用热键(如shift + d
)切换它,然后在你再次按下它时停止。我试过搞乱 pynput
,但我所做的一切要么导致错误,要么当我点击按钮时程序崩溃。
from tkinter import Tk,Button,Checkbutton,Entry,Frame
import time
import threading
from pynput.keyboard import Listener,KeyCode,Controller,Key
from pynput import keyboard
#Main window of the Gui
root = Tk()
root.title("Phrase Test")
root.configure(bg="black")
root.geometry("250x100")
root.resizable(width=False,height=False)
#delete text in entry Box
def some_callback(event):
event.widget.delete(0,"end")
return None
#Command Entry Box
e = Entry(root,width=25,bg="#101010",highlightbackground="black",fg="white",justify="center")
e.pack()
e.insert(0,"Enter your phrase:")
e.bind("<Double-1>",some_callback)
#Cooldown entryBox
e2 = Entry(root,justify="center")
e2.pack()
e2.insert(0,"Enter cooldown time:")
e2.bind("<Double-1>",some_callback)
#Command
def makemoney():
keyboard = Controller()
while True:
keyboard.type(e.get())
keyboard.press(Key.enter)
keyboard.release(Key.enter)
time.sleep(e2.get())
#Activate Button
myButton = Button(root,text="Enter",command=makemoney,bg="black",fg="white")
myButton.pack()
root.mainloop()
解决方法
根据我从您的问题中了解到的,您可以尝试这样的操作(这是您可以执行此操作的多种方法之一)
from tkinter import Tk,Button,Checkbutton,Entry,Frame
import keyboard
#Main window of the Gui
root = Tk()
root.title("Phrase Test")
root.configure(bg="black")
root.geometry("250x100")
root.resizable(width=False,height=False)
#delete text in entry box
def some_callback(event):
event.widget.delete(0,"end")
return None
def check():
global pressed
if keyboard.is_pressed('Shift') and keyboard.is_pressed('d'):
keyboard.press('\b')
if not pressed:
pressed=True
makemoney()
else:
pressed=False
root.update()
root.after(100,check)
def makemoney():
if pressed:
keyboard.write(e.get())
root.after(int(e2.get())*1000,makemoney)
#Command Entry box
e = Entry(root,width=25,bg="#101010",highlightbackground="black",fg="white",justify="center")
e.pack()
e.insert(0,"Enter your phrase:")
e.bind("<Double-1>",some_callback)
#Cooldown entrybox
e2 = Entry(root,justify="center")
e2.pack()
e2.insert(0,"Enter cooldown time:")
e2.bind("<Double-1>",some_callback)
pressed=False
#Activate Button
myButton = Button(root,text="Enter",command=check,bg="black",fg="white")
myButton.pack()
root.mainloop()
- 我使用了
keyboard
模块而不是pynput
,它应该足以满足您的用例。 - 我尝试不使用带有
while
函数的无限time.sleep()
循环,因为它会干扰主线程,而是使用.after()
方法来安排调用。立> - 我定义了一个函数
check()
,它检查Shift + d
的按键事件,更改pressed
标志并相应地调用makemoney()
函数。它每隔100
毫秒重复一次。 - 如果第一次按下热键,
makemoney()
函数会在每指定秒后调用自身。
你可以改进代码,但我希望这提供了一个关于如何去做的想法。