问题描述
我正在尝试为我的朋友制作一个点击游戏。我只想知道如何制作一个按钮,当点击时,点击另一个按钮。部分代码如下:
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()
函数负责更新 score
和 clicker_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()