微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以使用tkinter按钮重复更改画布对象吗?

如何解决可以使用tkinter按钮重复更改画布对象吗?

我试图创建一个GUI来表示三角形对称组的图形解释(即等边三角形的反射和旋转,使其保持不变)。 理想情况下,我希望以动画方式进行此操作,但这超出了我的范围,因此,我只是在更改点上的标签,并希望使用按钮进行反射或旋转,但是我不能获取按钮以实际更改我需要它们的坐标值。

我正在尝试在以下代码中交换p1,p2和p3的坐标 `

@Published

`

当我运行它并按下旋转按钮时,p1将使用原始值进行打印,无论按钮被按下了多少次,它只会打印一次。 如何解决此问题,是否有更好的程序包可以对此进行动画处理? 谢谢!

解决方法

这样的按钮不能将参数传递给命令。 您所做的实际上是在创建按钮时评估ro(p1,p2,p3),获取该方法的返回值(即None)并将其保存为命令。因此,当您按下按钮时,它会调用None ....这当然不会执行任何操作。

通常,当您按下按钮时,该命令应仅是方法名称 例: l = tk.Button(top,text =“ Rotate”,command = ro)

这是python的东西,您可以在其中像对待变量一样对待整个方法。 因此,也许可以这样做,并将方法更改为如下所示:

def ro():
    p4=p1
    p1=p2
    p2=p3
    p3=p4
    print(p4)

如果确实需要传递参数,这是最常见的解决方法:

l = tk.Button(top,text="Rotate",command=lambda: ro(p1,p2,p3)

关于它为什么起作用的问题,有一个很长的解释,您可以查找lambda关键字在python中的功能以进一步了解它。

编辑,如评论中所述

按原样使用变量可能会导致某些奇怪的事情发生。即,它不会“保存”对变量的更改。之所以发生这种情况,是因为您正在使用的变量的作用域仅限于使用它们的函数。也就是说,您正在使用的名称是在函数中创建的,因此一旦函数完成,它们就会被删除。有几种方法可以解决此问题。

一种方法是将名称全局保存,删除参数并告诉函数它们是全局的:

p1 = 5  # these are just examples,make sure they are established
p2 = 7  # on the root level,or at least on the level that your
p3 = 12 # button is made or lower

def ro():
    global p1,p3 # this will insist on using the globally named variables and not things specific to this function
    p1,p3 = p2,p3,p1 # oh,btw,you can do this to save space and not have to make a p4

在这种情况下,您将必须删除lambda并将其称为“ ro”作为命令。 这将完成您想要的,但是有几个问题:

  1. 除了旋转这三件事之外,您不能将ro()方法用于其他任何事情
  2. 通常不赞成使用'global'关键字,我个人从不使用

您可能会满意的是,像这样:

p = [14,12,83]
q = [1,43,18,75]

def ro(x):
    first = x.pop(0)
    x.append(first)

print(p)
ro(p)
print(p)
print()
print(q)
ro(q)
print(q)

如果运行该命令,将会看到它旋转任意列表中的所有数字。 这样,您可以将三角形存储在列表中,然后按如下所示创建按钮:

l=tk.Button(top,command=lambda: ro(p))

,它将更改为ro()命令提供的列表,您无需担心变量的作用域,因为您在ro(p)中将其与'p'一起传递了它,并且可以对任何内容进行更改通过。

我希望能帮上忙。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。