1

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

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了 1clicker_button的 arg 和 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, text='click me', command=counter(1))
points_button.grid(row=0, column=0)

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

每当我单击时clicker_buttonpoints_button都会单击,但程序会崩溃。我完全放弃了这个autoclicker(args)功能。

4

1 回答 1

1

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

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_buttontime_interval

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

编辑(问题编辑后)

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

如果您想在没有autoclicker()编辑中所说的功能的情况下工作,您可以进行以下更改

def counter(args):
    global score
    if args==1:
        score += 1
        points_label.config(text=score)
    elif args==2:
        time_interval=1000 #change it as you like
        points_button.invoke()
        root.after(time_interval,lambda:counter(2))

points_button = Button(root, text='click me', command=lambda:counter(1))
于 2020-12-29T04:27:40.637 回答