按钮单击不在tkinter上注册(关闭)

2024-09-25 16:19:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个学校项目,这是一个游戏围绕着点击一个目标,随机产卵为基础的程序。当前,当我单击目标时,什么都没有发生,也没有指向hitcounter函数。我的笔记本电脑有点慢,但每当我试图点击按钮,也没有登记的点击图形。你知道吗

我尝试过冗余地使用lambda,但没有解决这个问题,但是我看到有两个人请求我的函数,我在单击按钮后调用了这个函数,所以我提供了它。如果有任何进一步的疑问,请询问,我不会失去这个帐户。你知道吗

...
def hitcounter(*args):
    print("  wdwd ")
    hitcounter += 1
    canvas.delete("counter1_")
    counter1_ = canvas.create_text(screenwidth-50,screenheight/4,fill="Blue",font="Times 20",text="HiTS:"+'\n '+str(hitcounter), tag='counter1')
#as requested, I hope this helps thanks!

    spawntarget()

def spawntarget():
    print("spawntarget")
    x_target = random.randint(75,screenwidth-75-50)
    y_target = random.randint(75,screenheight-75-100)
    global clicktarget
    clicktarget=Button(root ,text='ENEMY', width=10, height=10, command = hitcounter)
    clicktarget.configure(fg='red', bg='gold')
    print("spawntarget2")
    while True:
        clicktarget.place(x=x_target,y=y_target)
        canvas.update()
        time.sleep(3)
        x_target = random.randint(75,screenwidth-75-50)
        y_target = random.randint(75,screenheight-75-100)


root.mainloop()

#I want my button to be clicked and 
#call upon the hitcounter function, 
#but currently it does not and there 
#is no error message. Thanks for looking at my problem.

Tags: 函数texttarget目标random按钮canvasprint
2条回答

你不应该那样睡你的节目。在下面的方法之后使用tkinters。after方法将函数调用插入mainloop。你知道吗

def hitcounter(*args):
    print("  wdwd ")
    hitcounter += 1
    canvas.delete("counter1_")
    counter1_ = canvas.create_text(screenwidth-50,screenheight/4,fill="Blue",font="Times 20",text="HiTS:"+'\n '+str(hitcounter), tag='counter1')


def change_placement():
    clicktarget.place(x=x_target,y=y_target)
    canvas.update()
    x_target = random.randint(75,screenwidth-75-50)
    y_target = random.randint(75,screenheight-75-100)
    root.after(3000, change_placement)


def spawntarget():
    print("spawntarget")
    x_target = random.randint(75,screenwidth-75-50)
    y_target = random.randint(75,screenheight-75-100)
    global clicktarget
    clicktarget=Button(root ,text='ENEMY', width=10, height=10, command = hitcounter)
    clicktarget.configure(fg='red', bg='gold')
    change_placement()


spawntarget()

root.mainloop()

您可以使用画布项目作为移动的目标,而无需销毁和重新创建它。在下面的例子中,目标是一个圆,因此我可以通过测量与目标的距离,并将其与目标的半径进行比较,来确定命中是否成功。(您还可以使用其他tk.canvas方法来判断您的单击是否在某个项目上)。你知道吗

tkinter有一些特殊的变量tk.IntVar,您可以将这些变量与标签一起使用,以保持点击次数的计数并显示它。这消除了对丑陋的global声明的需要。你知道吗

不建议使用time.sleepcanvas.update;您可以使用mainloop来管理游戏的逻辑。你知道吗

作为游戏的一个扩展,你可以减少目标的大小,减少静止时间,因为猎人积累了成功的命中率(我把这个留给你去实现)

import tkinter as tk
import random

WIDTH, HEIGHT = 600, 600
TARGET_RADIUS = 10

def is_target_hit(x, y):
    x0, y0, x1, y1 = canvas.coords(target)
    xc, yc = (x0 + x1) / 2, (y0 + y1) / 2
    return ((x - xc)**2 + (y - yc)**2)**0.5 < TARGET_RADIUS

def hitcounter(event):
    hits.set(hits.get() + 1)
    if is_target_hit(event.x, event.y):
        hits_on_target.set(hits_on_target.get() + 1)

def get_random_coords():
    x = random.randrange(TARGET_RADIUS, WIDTH-TARGET_RADIUS)
    y = random.randrange(TARGET_RADIUS, HEIGHT-TARGET_RADIUS)
    return x-TARGET_RADIUS, y-TARGET_RADIUS, x+TARGET_RADIUS, y+TARGET_RADIUS

def spawntarget():
    canvas.coords(target, *get_random_coords())
    canvas.after(1000, spawntarget)

root = tk.Tk()

hits, hits_on_target = tk.IntVar(root), tk.IntVar(root)
hits.set(0), hits_on_target.set(0)

tk.Label(root, text='hits:').pack()
hits_label = tk.Label(root, textvariable=hits)
hits_label.pack()
tk.Label(root, text='hits_on_target:').pack()
hits_on_target_label = tk.Label(root, textvariable=hits_on_target)
hits_on_target_label.pack()

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT)
canvas.pack(expand=True, fill=tk.BOTH)

target = canvas.create_oval(*get_random_coords(), fill='red')
canvas.bind('<1>', hitcounter)

spawntarget()

root.mainloop()

相关问题 更多 >