如何让 tkinter 按钮自己点击?

问题描述

我正在尝试为我的朋友制作一个点击游戏。我只想知道如何制作一个按钮,当点击时,点击另一个按钮。部分代码如下:

from tkinter import *
import time
root = Tk()
root.geometry('600x600')
score = 2000000
clicker_counter = 0

def counter():
    global score
    score += 1
    points_label.config(text=score)

def autoclicker(args):
    global clicker_counter
    if args == 1:
        pass

def clickerpurchase():
    global clicker_counter
    global score
    if score >= 1000:
        score -= 1000
        clicker_counter += 1
        points_label.config(text=score)
        clicker_label['text'] += str(clicker_counter)
        clicker_label.config(text='purchase clicker(1k): ' + str(clicker_counter))

clicker_button = Button(root,text='purchase',command=lambda:[clickerpurchase,autoclicker(1)])
clicker_button.grid(row=0,column=3)

clicker_label = Label(root,text='purchase clicker(1k): ')
clicker_label.grid(row=0,column=2)

points_label = Label(root,text='0')
points_label.grid(row=0,column=1)

points_button = Button(root,text='click me',command=counter)
points_button.grid(row=0,column=0)

points_label.config(text=score)
root.mainloop()

clicker_button 是主要问题。 clickerpurchase() 函数负责更新 scoreclicker_counter。该按钮还与 autoclicker(args) 相关联。我希望 clicker_button 每隔一段时间点击一次 points_button。我想把自动点击代码放在 autoclicker(args) 函数中,但我不知道它的代码

编辑: 我在 counter() 函数中创建了一个“while”循环,并在其中添加args。我给了 points_button 一个 1 的 arg 和一个 clicker_button 一个 2 的 arg。我的代码现在看起来像这样:

def counter(args):
    global score
    if args == 1:
        score += 1
        points_label.config(text=score)
    if args == 2:
        while args == 2:
            time.sleep(1)
            points_button.invoke()

points_button = Button(root,command=counter(1))
points_button.grid(row=0,column=0)

clicker_button = Button(root,counter(2)])
clicker_button.grid(row=0,column=3)

每当我点击 clicker_button 时,points_button 都会被点击,但程序会崩溃。我完全放弃了 autoclicker(args) 函数

解决方法

就你的功能而言,你可以尝试这样的事情

def autoclicker(args):
    global clicker_counter
    if args == 1:
        time_interval=1000 #change it as you like
        points_button.invoke()
        root.after(time_interval,lambda:autoclicker(1))

我使用了 root.after() 方法,这将在您指定的每 points_button 毫秒调用一次您的 time_interval

此外,据我所知,您的目标是(请随时纠正我),您实际上并不需要一个按钮来增加分数,您只需替换 {{1} } 在带有 points_button.invoke() 的代码中,它应该给出相同的结果。即使您计划拥有多个这些,您也可以将不同的参数传递给 counter()clickerpurchase()counter(),以便为每个项目获得不同的分数。

编辑(问题编辑后)

autoclicker(args) 在无限循环中将不起作用,因为整个程序将等待它完成才能执行任何其他事情,因此它停止响应并崩溃。尝试以我上面提到的类似方式使用 time.sleep() 方法。

如果您想在没有编辑中所说的 .after() 函数的情况下工作,您可以进行以下更改

autoclicker()