2

私がやりたいのは、ユーザーにキャンバスのどこかをクリックしてから、他の場所をクリックして、2点の間に直線を引くようにすることです。私はTKinterを初めて使用しますが、グーグルで検索した後、これに対する確実な答えを見つけるのに苦労しています。

私の考えでは、キャンバス上のマウス座標を渡すonclickイベントと、キャンバス上のそれらの座標を渡すonreleaseイベントがあり、それらの間に線が作成されます。この行は、別のボタンを使用してある時点で削除できるオブジェクトである必要がありますが、それは別の問題です。

どんな助けでも大歓迎です、あるいはまた役立つかもしれない記事/チュートリアルへのリンクさえ

4

2 に答える 2

7

あなたがしなければならない唯一のことは、キャンバスにバインドすること"<Button-1>"です"<ButtonRelease-1>"

from Tkinter import Tk, Canvas

start = None

def onclick_handler(event):
    global start
    start = (event.x, event.y)

def onrelease_handler(event):
    global start
    if start is not None:
        x = start[0]
        y = start[1]
        event.widget.create_line(x, y, event.x, event.y)
        start = None

master = Tk()
canvas = Canvas(master, width=200, height=200)
canvas.bind("<Button-1>", onclick_handler)
canvas.bind("<ButtonRelease-1>", onrelease_handler)
canvas.pack()
master.mainloop()

グローバル変数を使用するのはまったく好きではありません。クラス内のすべてのウィジェットと関連する関数をラップする方がはるかにクリーンです。ただし、例としては十分に明確だと思います。

于 2013-02-24T04:59:59.240 に答える
2

私にはかなり率直に見えます。

こちらの Canvas のドキュメントを確認してください: http://effbot.org/tkinterbook/canvas.htm

イベントについてはこちら: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

そして、次のようなコードを入力するだけです。クラスは、単純な hello World よりもさらに複雑です。2 つのグローバル変数を使用すると、コードが単純になります。

from Tkinter import Canvas, Tk, mainloop
w = Tk()
c = Canvas(w)
c.pack()

class DrawLines(object):
    def __init__(self, canvas):
        self.canvas = canvas
        self.start_coords = None
        self.end_coords = None
    def __call__(self, event):
        coords = event.x, event.y
        if not self.start_coords:
            self.start_coords = coords
            return
        self.end_coords = coords
        self.canvas.create_line(self.start_coords[0],
                                self.start_coords[1],
                                self.end_coords[0],
                                self.end_coords[1])
        self.start_coords = self.end_coords

c.bind("<Button-1>", DrawLines(c))

mainloop()
于 2013-02-24T05:11:05.410 に答える