微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

定义窗口并添加mainloop后,Tkinter窗口未打开

如何解决定义窗口并添加mainloop后,Tkinter窗口未打开

我试图制作一种改进的自动点击器,使其具有更多功能,例如:

  1. 一个键保存光标位置
  2. 按按键执行
  3. 按下按键即可杀死该程序 这是代码
import win32api,win32com
import pyautogui
import tkinter as tk
from time import sleep
import keyboard

win = tk.Tk()
cursor = (0,0)
di = 0

e = tk.Entry()

def geti():
    di = float(e.get())


l = tk.Label(text="Info:").pack()
l1 = tk.Label(text="Press q to stop clicking").pack()
l2 = tk.Label(text="Press c to copy mouse position to execute on").pack()
l3 = tk.Label(text="Press e to start executing").pack()

dl = tk.Label(text="Delay between eack click (s)").pack()
e.pack()
b = tk.Button(text="save delay time",command=geti).pack()

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0)
    sleep(di)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0)

while True:

    if(keyboard.is_pressed('c') == True):
        cursor = pyautogui.position()

    if(keyboard.is_pressed('q') == True):
        break
    
    if(keyboard.is_pressed('e') == True):
        click(cursor[0],cursor[1])
        
win.mainloop()

解决方法

您的while循环块win.mainloop()。 无需检查按键,您可以将tkinters事件系统与bind一起使用:

win.bind('key',callback)
# thanks to @acw1668's comment: added evt
win.bind('e',lambda evt: click(cursor[0],cursor[1]))

lambda是必需的,因为您希望调用函数而不是结果。来自the tkinter docs

如果这样做,Python将在创建之前调用回调函数 小部件,然后将函数的返回值传递给Tkinter。 Tkinter 然后尝试将返回值转换为字符串,并告诉Tk 激活按钮后,使用该名称调用一个函数。这是 可能不是您想要的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。