Python Tkinter canvas.tag_bind()
Python Tkinter canvas.tag_bind()
我一直在 Python 上使用 Tkinter 编写此代码,在一天结束时,我将能够单击图片(而不是单击带有 x 的特定点, y 在图片的边框中,但在整个图片的边框中的任意位置)然后单击屏幕上的任意位置,并能够将其移动到那里。
我的代码:
from Tkinter import *
from PIL import ImageTk, Image
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Constants~
CLICKED = False
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Classes and Functions~
class App(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
def asign_click(event):
CLICKED = True
print CLICKED
def new_destination(event, x, y, canvas, picture):
if CLICKED == True:
canvas.move(picture, x, y)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Main~
myapp = App()
myapp.master.title("DA-I-SUKI!! <3~")
myapp.master.maxsize(2000, 1200)
my_picture = ImageTk.PhotoImage(Image.open("SOME_PICTURE"))
canvas = Canvas(height = my_picture.height(), width = my_picture.width())
canvas.pack(expand=1, fill=BOTH)
picture_pack = canvas.create_image(1130, 500, image = my_picture)
canvas.tag_bind(my_picture, '<1>', asign_click)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
myapp.mainloop()
基本上,我希望代码末尾的 tag_bind 能够调用 asign_click(),并将 CLICKED 的常量值更改为 TRUE,然后添加另一个 tag_bind(或任何其他工作),这将允许我单击屏幕上的任意位置并调用 new_destination(),这样它将把图片移动到新的目的地。
- 我可能在 new_destination() 函数上输入了错误的参数,仍在处理中。
非常感谢。
您只是在 tag_unbind
中犯了一个小错误,根据 effbot.org 此方法需要标签或 ID。但是你传递的是一个图像对象。每当您从 canvas 对象调用 create_...
时,都会在 return 上给出一个 id。
所以只需将 canvas.tag_bind(...)
行更改为 canvas.tag_bind(picture_pack, '<1>', asign_click)
我一直在 Python 上使用 Tkinter 编写此代码,在一天结束时,我将能够单击图片(而不是单击带有 x 的特定点, y 在图片的边框中,但在整个图片的边框中的任意位置)然后单击屏幕上的任意位置,并能够将其移动到那里。
我的代码:
from Tkinter import *
from PIL import ImageTk, Image
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Constants~
CLICKED = False
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Classes and Functions~
class App(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
def asign_click(event):
CLICKED = True
print CLICKED
def new_destination(event, x, y, canvas, picture):
if CLICKED == True:
canvas.move(picture, x, y)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#Main~
myapp = App()
myapp.master.title("DA-I-SUKI!! <3~")
myapp.master.maxsize(2000, 1200)
my_picture = ImageTk.PhotoImage(Image.open("SOME_PICTURE"))
canvas = Canvas(height = my_picture.height(), width = my_picture.width())
canvas.pack(expand=1, fill=BOTH)
picture_pack = canvas.create_image(1130, 500, image = my_picture)
canvas.tag_bind(my_picture, '<1>', asign_click)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
myapp.mainloop()
基本上,我希望代码末尾的 tag_bind 能够调用 asign_click(),并将 CLICKED 的常量值更改为 TRUE,然后添加另一个 tag_bind(或任何其他工作),这将允许我单击屏幕上的任意位置并调用 new_destination(),这样它将把图片移动到新的目的地。
- 我可能在 new_destination() 函数上输入了错误的参数,仍在处理中。
非常感谢。
您只是在 tag_unbind
中犯了一个小错误,根据 effbot.org 此方法需要标签或 ID。但是你传递的是一个图像对象。每当您从 canvas 对象调用 create_...
时,都会在 return 上给出一个 id。
所以只需将 canvas.tag_bind(...)
行更改为 canvas.tag_bind(picture_pack, '<1>', asign_click)