在Tkinter Canvas Widget中键入文本

时间:2013-07-19 18:24:11

标签: python python-2.7 tkinter

我需要允许用户在Canvas Widget中键入文本,在用户键入新文本时更新画布。

这是我到目前为止所尝试过的,但我没有让它发挥作用。

首先,我有一个绑定到Button-1事件的mouseDown方法

widget.bind(self.canvas, "<Button-1>", self.mouseDown)

mouseDown方法会将startx, starty个位置返回到我的方法drawText

def drawText(self, x, y, fg):
    self.currentObject = self.canvas.create_text(x,y,fill=fg,text=self.typedtext)

我还在画布小部件上有一个全局绑定来捕获这样的按键:

Widget.bind(self.canvas, "<Any KeyPress>", self.currentTypedText)

def currentTypedText(self, event):
    self.typedtext = str(event.keysym)
    self.drawText(self, self.startx, self.starty,self.foreground)

但是没有错误,画布上没有任何内容。

1 个答案:

答案 0 :(得分:2)

你想要做的事情非常复杂,需要相当多的代码才能很好地运作。您需要处理点击事件,按键事件,特殊按键事件(例如“Shift”和“Ctrl”),“退格”和删除事件等等。

然而,首先是第一个,即用户输入的文本将显示在画布中。现在,因为我没有完整的脚本,所以我不能真正使用你的东西。但是,我去制作了自己的小应用程序,它完全符合您的要求。希望它会为将去哪里发光:

from Tkinter import *

class App(Tk):

    def __init__(self):
        Tk.__init__(self)
        # self.x and self.y are the current mouse position
        # They are set to None here because nobody has clicked anywhere yet.
        self.x = None
        self.y = None
        self.makeCanvas()
        self.bind("<Any KeyPress>", lambda event: self.drawText(event.keysym))

    def makeCanvas(self):
        self.canvas = Canvas(self)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.mouseDown)

    def mouseDown(self, event):
        # Set self.x and self.y to the current mouse position
        self.x = event.x
        self.y = event.y

    def drawText(self, newkey):
        # The if statement makes sure we have clicked somewhere.
        if None not in {self.x, self.y}:
            self.canvas.create_text(self.x, self.y, text=newkey)
            # I set x to increase by 5 each time (it looked the nicest).
            # 4 smashed the letters and 6 left gaps.
            self.x += 5

App().mainloop()

单击画布中的某个位置并开始键入后,您将看到文本。但请注意,我没有启用此功能来处理文本的删除(这有点棘手且超出了您的问题范围)。