【问题标题】:how to make a tkinter button click itself?如何让 tkinter 按钮自行点击?
【发布时间】:2020-12-29 02:03:05
【问题描述】:

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

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 一个 arg 1 和 clicker_button 一个 arg 2。我的代码现在看起来像这样:

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_button 时,points_button 都会被单击,但程序会崩溃。我完全抛弃了autoclicker(args) 函数。

【问题讨论】:

  • 为什么你希望按钮被点击?您可以根据需要每隔一段时间调用相关函数counter()
  • 另外,args的值有什么意义?
  • @AST args 值不执行任何操作。我只是在寻找解决问题的方法。
  • 阅读文档。该按钮有一个invoke 方法。
  • @AST 而不是手动单击以获得分数我希望程序每隔一段时间为我单击一次。请注意,分数应该等于零。我将其设置为高以用于测试目的

标签: tkinter tkinter-button


【解决方案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() 方法,这将在您指定的每time_interval 毫秒内调用您的points_button

另外,据我了解,您的目标是(请随时纠正我),您实际上并不需要一个按钮来增加分数,您只需将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))

【讨论】:

  • 另一件事仅供参考,我注意到如果此人在点击 clicker_button 后点击它,这可能是一个逻辑问题,因为您已将 counter(2) 链接到按钮,它会增加分数更新的频率并且也不会降低分数,为了克服这个问题,您可以从购买按钮中删除调用counter函数并在clickerpurchase中添加一些条件counter(2)仅称为if score==0
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2019-02-02
  • 2012-06-22
相关资源
最近更新 更多