我正在尝试编写单人游戏程序 - 主要是探索如何使用鼠标在使用Tkinter的GUI中移动对象。我发现以下代码允许用户使用鼠标在窗口周围移动卡片:
from tkinter import *
window = Tk()
window.state('zoomed')
window.configure(bg = 'green4')
def drag(event):
card.place(x=event.x_root, y=event.y_root,anchor=CENTER)
card = Canvas(window, width=74, height=97, bg='blue')
card.place(x=300, y=600,anchor=CENTER)
card.bind("<B1-Motion>", drag)
window.mainloop()
但是,如果我添加另一张卡,如:
another_card = Canvas(window, width=74, height=97, bg='red')
another_card.place(x=600, y=600,anchor=CENTER)
another_card.bind("<B1-Motion>", drag)
点击此卡只会移动第一张卡。当我尝试修改拖动功能时,如:
def drag(event, card):
card.place(x=event.x_root, y=event.y_root,anchor=CENTER)
和
another_card.bind("<B1-Motion>", drag(event, another_card))
我得到了太多的论据&#39;或者&#34;名称&#39;事件&#39;没有定义&#34;错误。由于我最终将在屏幕上拥有多达52张卡片,因此我无法为每张卡片编写单独的拖动功能。是否可以写一个通用的&#39;拖动&#39;可以绑定到任何对象的代码吗?
PS在这个例子中我刚刚使用了一个空白画布。但是我有52张扑克牌的GIF,我希望(希望)在游戏中围绕GUI移动。
答案 0 :(得分:2)
问题是您正在硬编码drag()
功能中对第一张卡的引用。
from tkinter import *
window = Tk()
window.state('zoomed')
window.configure(bg = 'green4')
def drag(event):
event.widget.place(x=event.x_root, y=event.y_root,anchor=CENTER)
card = Canvas(window, width=74, height=97, bg='blue')
card.place(x=300, y=600,anchor=CENTER)
card.bind("<B1-Motion>", drag)
another_card = Canvas(window, width=74, height=97, bg='red')
another_card.place(x=600, y=600,anchor=CENTER)
another_card.bind("<B1-Motion>", drag)
window.mainloop()
使用event.widget
,您始终会获得生成Canvas
的小部件(event
)。