【问题标题】:Detect click in python检测python中的点击
【发布时间】:2021-03-04 20:41:17
【问题描述】:

我希望在 python 中创建一个 CPS(ClickPerSecond) 应用程序 我做了一些研究,终于有了这个代码:

from pynput.mouse import Listener, Button, Controller
import time

new = 0
old = 0

def on_click(x, y, button, pressed):
  global old
  global new
  if pressed:
    new = time.time()
    print("Click Detected")
    CPS = round((1/(old-new))*-1)
    old = new
    print(CPS)
      
with Listener(on_click=on_click) as listener:
      listener.join()

此代码检测右击和左击并计算我的 CPS。 但我想要一个与 tkinter 的接口,它只编写我的 CPS 的文本变量。 最大的问题是我想点击屏幕上的每一个地方,这会检测到它。 但我不知道如何将它插入到我的代码中。 T-T

你能帮帮我吗?

【问题讨论】:

    标签: python tkinter onclick pynput


    【解决方案1】:

    这是一个简单的解决方案,我相信它可以满足您的需求。此方法不需要pynputtime。相反,我们利用 tkinter 的 afterbind_all 方法。

    import tkinter as tk
    
    root = tk.Tk()
    
    cps_lbl = tk.Label(root)
    cps_lbl.grid()
    
    #reset cps to zero every second
    def reset_counter():
        global cps
        cps = 0
        root.after(1000, reset_counter)
    
    #increment cps and publish results
    def click_counter(event):
        global cps
        cps += 1
        cps_lbl['text'] = f'{cps} clicks per second'
        
    root.bind_all('<1>', click_counter) #left click
    root.bind_all('<3>', click_counter) #right click
    
    reset_counter()
    
    root.mainloop()   
    

    或者,您可以将bind 替换为root 并强制焦点停留在root 上,而不是bind_all

    替换:

    root.bind_all('<1>', click_counter) #left click
    root.bind_all('<3>', click_counter) #right click
    

    与:

    root.bind('<1>', click_counter)
    root.bind('<3>', click_counter)
    root.focus_force()
    

    【讨论】:

    • 谢谢,你的代码可以工作,但是当我点击窗口时它们只会计算点击(这就是我使用 pynput 的原因)但我会尝试单独修复它非常感谢 :)
    【解决方案2】:

    对不完全完整的问题有点讽刺的回答是在 tk 上创建全屏画布并计算点击次数。 例如

    import tkinter
    root = tkinter.Tk()
    root.overrideredirect(True)
    root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
    
    var = StringVar()
    label = Label(root, textvariable=var, relief=RAISED)
    
    var.set("Hey!? Are You Click'n or what?") # set it to Your CPS
    label.pack()
    root.mainloop()
    

    【讨论】:

    • 是的,这是可能的,但如果我想知道我在游戏中的 cps,我必须检测不在窗口上的点击或尝试使其完全透明,除了显示我的 cps 和即使我在另一个窗口上也保持活动状态
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2018-01-04
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多