如何在函数中创建tkinter canvas文本变量

时间:2015-12-01 14:24:12

标签: javascript python canvas tkinter

我正在尝试将不同的字符串传递给使用循环函数在网格中创建的画布文本。文本绑定到事件处理程序,并且打印证明它应该能够在触发事件时进行更改,但我还没有想出如何执行此操作。

请考虑以下代码:

from Tkinter import *

def create_grid():
    rows=2
    cols=2
    canvasID = 0
    for r in range(rows):
        c=0
        for col in range(cols):

            cv=Canvas(bg='white',width=200,height=150)
            cv.grid(row=r,column=c)

            imageFile=PhotoImage(width=200,height=150)
            imageFile.put('black',to=(0,0,197,147))

            cv.image=imageFile
            cv.create_image(200/2,150/2,anchor=CENTER,image=imageFile)
            txt=cv.create_text(200/2,150/2,fill='white',anchor=CENTER,font=("Arial",18,'bold'),text=var.get())

            def enter_lambda(canvasID):
                return lambda event:on_enter(event,canvasID)
            def leave_lambda(canvasID):
                return lambda event:on_leave(event,canvasID)

            cv.bind("<Enter>", enter_lambda(canvasID))
            cv.bind("<Leave>", leave_lambda(canvasID))

            canvasID+=1
            c+=1
        r+=1

def on_enter(event,canvasID,*args):
    var="in"
    print var,str(canvasID)
def on_leave(event,canvasID,*args):
    var="out"
    print var,str(canvasID)

root=Tk()
app=Frame(root)

var=StringVar()
var.set("out")

create_grid()
root.mainloop()

类似的问题可以在How to add a Tkinter Text Variable in canvas text找到,虽然使用这种方法不起作用,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:0)

我认为你想要的是当鼠标在方块内时,方形中的单词为“IN”,当鼠标位于方形外时,为“OUT”。

如果是这样,有很多方法可以实现这一目标。最简单的方法是将文本项的id传递给回调,并使用itemconfigure更改值。您无需使用StrngVar即可完成此任务。

例如:

txt=cv.create_text(..., text="OUT")
...
def enter_lambda(canvasID, textID):
    return lambda event:on_enter(event,canvasID, textID)
def leave_lambda(canvasID, textID):
    return lambda event:on_leave(event,canvasID, textID)
...
cv.bind("<Enter>", enter_lambda(canvasID, txt))
cv.bind("<Leave>", leave_lambda(canvasID, txt))
...
def on_enter(event,canvasID, txt):
    cv = event.widget
    cv.itemconfigure(txt, text="IN %s" % canvasID)

def on_leave(event,canvasID, txt):
    cv = event.widget
    cv.itemconfigure(txt, text="OUT %s" % canvasID)