【问题标题】:How to make tkinter canvas text variable in function如何在函数中使 tkinter 画布文本变量
【发布时间】:2015-12-01 14:24:11
【问题描述】:

我正在尝试将不同的字符串传递给使用循环函数在网格内创建的画布文本。文本绑定了事件处理程序,打印证明应该可以在事件触发时改变,但我还没想好怎么做。

考虑以下代码:

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 找到类似的问题,尽管使用这种方法没有奏效,我不知道为什么。

【问题讨论】:

  • 不清楚您期望发生什么。你能描述一下效果吗?当我进入方格 #2 时,会发生什么?
  • 澄清一下,效果应该是,如果您移动到方格 #2,文本应更改为“IN 2”,对于方格#3 为“IN 3”等。此外,当您离开方格时它应该能够指出还剩下哪个方格。

标签: javascript python canvas tkinter


【解决方案1】:

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

【讨论】:

  • 谢谢,该解决方案绝对适用于将文本从“OUT”更改为“IN”。但是我试图让文本显示状态(“IN”或“OUT”)并确定哪个画布被触发。例如“IN 3”或“IN 1”。由于 lambda 只接受一个 arg,那么这里的解决方案是什么?
  • @zarf.snackler:您可以将任意数量的参数传递给 lambda 函数。
  • 抱歉,当然可以,我对此很陌生,我错过了在 enter_lambda 函数中添加参数。您编辑的脚本符合我的期望。谢谢!
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 2022-01-06
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
相关资源
最近更新 更多