Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 线程和Tkinter不一起工作_Python_Multithreading_Tkinter_Keyboard_Python 3.6 - Fatal编程技术网

Python 线程和Tkinter不一起工作

Python 线程和Tkinter不一起工作,python,multithreading,tkinter,keyboard,python-3.6,Python,Multithreading,Tkinter,Keyboard,Python 3.6,试着用一个简单的自动点击器来练习Tkinter、Pyautogui和线程 它应该打开一个菜单(检查) 然后选择按钮(检查) 它会打开另一个窗口(检查) 当您按F7时,它开始单击(不工作) 没有Tkinter,这个很好用 以下是代码: from tkinter import * from pyautogui import * from time import * from threading import Thread as th import keyboard root = Tk()

试着用一个简单的自动点击器来练习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启动器不工作。

有什么想法吗?

好的,根据您对代码所做的尝试,最好在这里使用
after()
而不是线程。Tkinter始终监视所有按键,因此您可以将
F7
按钮绑定到顶层窗口

下面的代码将
F7
绑定到clicker toplevel窗口。当您在toplevel中单击以获得焦点时,您可以使用
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()
将tkinter作为tk导入
从pyautogui导入中,单击
root=tk.tk()
键循环=1
根几何(“150x500”)
def点击循环(事件=无):
单击()
root.after(100,单击\u循环)
def clicker():
clicker=tk.Toplevel(根目录)
根几何(“300x300”)
tk.Label(clicker,text=“Start-F7\n\nStop-F8”).pack()
按钮(clicker,text=“Exit”,command=clicker.destroy).pack()
clicker.bind(“,click\u循环)
按钮(root,text=“Auto Clicker”,command=Clicker).pack()
root.mainloop()

Pro提示。不要导入
*
。您可能会覆盖其他导入并导致代码出现问题。改为像
导入tkinter as tk那样导入,以防止库中重写方法出现任何问题。确定即可。感谢您我看到了这一点并修复了Sleep我认为您需要使用Tkinter中的
after()
方法来管理您需要使用的任何计时。线程是一个选项,但可能比您在这里需要的高级一点。@Mike SMT实际上,虽然通常不建议不要使用
import*
,但在本例中,中的示例使用了它,这就是为什么在使用
tkinter
时这样做非常流行的原因。