2

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

这是我迄今为止尝试过的,但没有让它发挥作用。

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

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)

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

4

1 回答 1

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

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

于 2013-07-19T19:38:25.757 回答