我需要允许用户在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)
但是没有错误,画布上没有任何内容。
答案 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()
单击画布中的某个位置并开始键入后,您将看到文本。但请注意,我没有启用此功能来处理文本的删除(这有点棘手且超出了您的问题范围)。