2

ユーザーがキャンバス ウィジェットにテキストを入力できるようにして、ユーザーが新しいテキストを入力するとキャンバスが更新されるようにする必要があります。

これが私がこれまでに試したことですが、うまくいきません。

まずmouseDown、Button-1 イベントにバインドされたメソッドがあります

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

このメソッドは、位置をmouseDownメソッドに返しますstartx, startydrawText

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 に答える