如何使函数中的tkinter画布文本变量

How to make tkinter canvas text variable in function

本文关键字:文本 变量 布文本 函数 何使 tkinter      更新时间:2023-09-26

我正试图将不同的字符串传递给使用循环函数在网格中创建的画布文本。文本被绑定到事件处理程序,打印证明它应该能够在事件被触发时进行更改,但我还没有弄清楚如何做到这一点

考虑以下代码:

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()

在"如何在画布文本中添加Tkinter文本变量"中也可以找到类似的问题,尽管使用这种方法不起作用,我也不知道为什么。

我想你想要的是,当鼠标在正方形内时,正方形中的单词为"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)