0

フレームを作成しましたが、サブフレームにジオメトリを描画する方法がわかりません。

これが私の現在のウィンドウのコードです:

class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.grid()

        self.Quit = Button(frame, text = "QUIT", command = frame.quit)
        self.Quit.grid(row = 0, column = 48, sticky = N)

        self.adpt = Button(frame, text = "Add Point", command = self.adpt)
        self.adpt.grid(row = 0, column = 49, sticky = N)

        self.adln = Button(frame, text = "Add Line", command = self.adln)
        self.adln.grid(row = 0, column = 50, sticky = N)

        self.adpg = Button(frame, text = "Add Polygon", command = self.adpg)
        self.adpg.grid(row = 0, column = 51, stick = N)


        iframe = Frame(frame, bd = 2, relief = RAISED,  width=1000, height=500)
        iframe.grid(row = 1, columnspan = 100, sticky = N)

    def adpt(self):
        pass

    def adln(self):
        pass

    def adpg(self):
        pass

対応するボタンをクリックして各種類のジオメトリを作成し、サブフレームに描画する必要がありますが、イベントを使用してサブフレーム (iframe) にジオメトリを描画する方法がわかりません。たとえば、点を描くには、「点を追加」ボタンをクリックします。次に、サブフレームをクリックしてポイントを生成します。サブフレームをダブルクリックして、ポイントをポイント リストに保存します。

最初の問題は、サブフレームをクリックしてポイントを描画する方法です。

2 つ目の問題は、サブフレーム ハンドルのダブル クリックとクリックを別々にする方法です。ウィジェットをダブルクリックすると、最初にクリック イベントが発生し、次にダブル クリック イベントが発生します。

キャンバスでジオメトリを描画するクラスを作成しました。ポイント、ライン、ポリゴンのクラスは、canvas でジオメトリを描画できます。

ポイントクラスのコード例は次のとおりです。

class Point:
    def __init__(self,x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return " (" + str(self.x) + "," + str(self.y) + ")"
    def draw(self,canvas):
        canvas.create_line(self.x-10,self.y,self.x+10,self.y)
        canvas.create_line(self.x,self.y-10,self.x,self.y+10)
4

1 に答える 1

0

ボタンでジオメトリのタイプを選択する場合は、それらのイベントハンドラで、使用するクラスを設定できます。次に、イベント情報の座標を使用して、キャンバスにアイテムを描画できます。

self.adln = Button(frame, text = "Add Line", command=self.adln)
self.adpt = Button(frame, text = "Add Point", command=self.adpt)
self.canvas.bind("<Button-1>", self.click)

#...
def adln(self):
    self.geometry = "Line"
def adpt(self):
    self.geometry = "Points"
#...

def click(self, event):
    if self.start is None:
        self.start = (event.x, event.y)
    else:
        self.draw_geometry()
        self.start = None
def draw_geometry(self):
    if self.geometry == "Points":
        p1 = Point(*self.start)
        p2 = Point(event.x, event.y)
        p1.draw(self.canvas)
        p2.draw(self.canvas)
    elif self.geometry == "Line":
        line = Line(event.x, event.y, *self.start)
        line.draw(self.canvas)

drawこれは単なる例であるため、コンストラクターの引数の数とメソッドの存在が、所有しているものと一致しない場合があることに注意してください。これは少し非Python的ですが、私が出てきた最も簡単な方法です。

一方、イベントは常にダブルクリックでトリガーされるため、またはなど<Button-1>の別のアクションには別のボタンを使用することをお勧めします。<Button-2><Button-3>

于 2013-03-18T00:06:46.530 に答える