浪矢秀一 2023-12-23 22:14 采纳率: 81.3%
浏览 9
已结题

Python关于Tkinter和Thread同时使用时的终止进程问题

我用python做了个连点器,但是最后在关闭窗口时却无法退出进程。
代码如下:

from time import sleep
from tkinter import Tk, Label, Radiobutton, StringVar, Entry
from sys import exit
from keyboard import add_hotkey
from threading import Thread
from pyautogui import click

def Click():
    global Start
    global Mode
    global IWillQuit
    global Entry1
    while True:
        if IWillQuit:
            break
        if Start:
            click(button = Mode.get())
            sleep(int(Entry1.get())/1000)
def Turn():
    global Start
    Start = not Start
    sleep(0.3)
def Main():
    global root
    global Mode
    global IWillQuit
    Label1 = Label(root, text = "点击类型: ")
    Label1.grid(row = 1, column = 1)
    Button1 = Radiobutton(root, text="鼠标左键", variable = Mode ,value = "Left")
    Button1.grid(row = 1, column = 2)
    Button2 = Radiobutton(root, text="鼠标中键", variable = Mode ,value = "Middle")
    Button2.grid(row = 1, column = 3)
    Button3 = Radiobutton(root, text="鼠标右键", variable = Mode ,value = "Right")
    Button3.grid(row = 1, column = 4)
    Label2 = Label(root, text = "间隔时间: ")
    Label2.grid(row = 2, column = 1)
    Label3 = Label(root, text = "ms")
    Label3.grid(row = 2, column = 4)
    Label4 = Label(root, text = "启停的热键: Ctrl+P")
    Label4.grid(row = 3, column = 1)
def Quit():
    global T1, T2
    global root
    IWillQuit = True
    root.destroy()
    T1.join()
    T2.join()
    exit()
Version = "0.0.0.1"
Start = False
IWillQuit = False
ww = 700
wh = 300
root = Tk()
root.title(f"连点器 {Version}")
sw, sh = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry(f"{ww}x{wh}+{(sw-ww)//2}+{(sh-wh)//2}")
root.resizable(False, False)
Mode=StringVar()
Mode.set("Left")
Entry1 = Entry(root)
Entry1.grid(row = 2, column = 2, columnspan = 3)
add_hotkey("ctrl+p", Turn)
T1 = Thread(target = Main)
T2 = Thread(target = Click)
T1.start()
T2.start()
Main()
root.protocol("WM_DELETE_WINDOW", Quit)
root.mainloop()

最后在Quit函数时,总是无法关闭进程,有没有人知道该怎么办?
如果您能回复我这个问题,我将万分感谢。

  • 写回答

2条回答 默认 最新

  • 虫虫仙人 2023-12-24 23:53
    关注
    
    兄弟,没关闭的原因是47行代码T2线程没关闭
    解决办法:Click()函数的死循环的开关放到关闭函数去
                      使关闭函数触发的同时,中止click函数死循环
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 创建了问题 12月23日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22