【问题标题】:Threads and Tkinter not working together线程和 Tkinter 不能一起工作
【发布时间】:2019-01-14 17:08:19
【问题描述】:

尝试使用简单(或者我认为是)自动点击器来练习 Tkinter、Pyautogui 和线程。

  • 应该打开一个菜单(检查),
  • 然后选择按钮(检查),
  • 它会打开另一个窗口(检查),
  • 当你按下 F7 时它开始点击(不工作)

没有 Tkinter 也可以正常工作

代码如下:

from tkinter import *
from pyautogui import *
from time import  *
from threading import Thread as th
import keyboard 

root = Tk()
key_loop = 1
k = ""
root.geometry("150x500")
def detect_key_def():
    global k
    while key_loop == 1:
        if keyboard.is_pressed('f7'):
            k = "f7"
        elif keyboard.is_pressed("f8"):
            k = "f8"
        elif keyboard.is_pressed("f9"):
            k = "f9"

detect_key = th(target=detect_key_def)
detect_key.start()
def clicker():
    clicker = Tk()
    root.geometry("300x300")

Label(clicker, text="Start - F7\n\nStop - F8").pack()
Button(clicker, text="Exit", command =clicker.destroy).pack()
if k == "f7":
    click()
    t.sleep(0.01)
elif k == "f8":
    t.sleep(0.01)
clicker.mainloop()

Button(root, text="Auto Clicker", command=clicker).pack()
root.mainloop()

当我运行代码时,F7 启动器不起作用。
有什么想法吗?

【问题讨论】:

  • 专业提示。不要导入*。您冒着覆盖其他导入并导致代码出现问题的风险。而是以 import tkinter as tk 之类的形式导入,以防止从库中覆盖方法出现任何问题。
  • 好的就行。谢谢
  • 是的,我看到了并修复了睡眠
  • 我认为您需要使用 Tkinter 的 after() 方法来管理您需要使用的任何时间。线程是一种选择,但可能比您需要的更高级。
  • @Mike-SMT 实际上,虽然一般不建议不要使用import *,但在这种情况下,documentation 中的示例使用它,这就是为什么它如此受欢迎的原因当使用tkinter

标签: python multithreading tkinter keyboard python-3.6


【解决方案1】:

好的,因此根据您尝试对代码执行的操作,最好在此处使用after() 而不是线程。无论如何,Tkinter 都会监控所有按键,因此您只需将 F7 按钮绑定到顶层窗口。

以下代码将F7 绑定到点击器顶层窗口。当您单击顶层以使其获得焦点时,您可以使用F7 开始自动单击。我将其设置为每秒点击 1 次。

import tkinter as tk
from pyautogui import click

root = tk.Tk()
key_loop = 1
root.geometry("150x500")

def click_loop(event=None):
    click()
    root.after(100, click_loop)

def clicker():
    clicker = tk.Toplevel(root)
    root.geometry("300x300")
    tk.Label(clicker, text="Start - F7\n\nStop - F8").pack()
    tk.Button(clicker, text="Exit", command =clicker.destroy).pack()
    clicker.bind("<F7>", click_loop)

tk.Button(root, text="Auto Clicker", command=clicker).pack()
root.mainloop()

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2019-08-17
    • 2016-11-23
    • 2019-02-18
    • 2015-05-16
    • 2017-10-14
    • 2012-06-01
    • 2011-11-05
    • 2018-05-20
    相关资源
    最近更新 更多