سؤال

أنا الآن أكتب محرر FSM مع Tkinter. لكنني عالقة في ربط ولايتين. لدي سؤالان:

1) كيف يمكن أن تجعل السهم الانتقالي ينمو وفقًا لحركة الماوس؟

2) كيف يمكنني التمسك بنقطة انطلاق السهم على حالة ونقطة نهاية السهم على دولة أخرى؟

ملاحظة. هل تعتقد أن وثائق Tkinter جيدة بما فيه الكفاية؟

هل كانت مفيدة؟

المحلول

إليك مثال يوضح المفهوم. باختصار ، استخدم العلامات لربط الخطوط مع الصناديق ، واطلب ببساطة ضبط الإحداثيات بشكل مناسب عندما ينقل المستخدم الماوس.

قم بتشغيل المثال ، ثم انقر واسحب من داخل مربع Beige.

بالطبع ، بالنسبة لكود الإنتاج ، تحتاج إلى حل أكثر عمومية ، ولكن نأمل أن يوضح لك هذا مدى سهولة إنشاء مربع مع الأسهم التي تعدل أثناء تحريك المربع.

from Tkinter import *

class CanvasDemo(Frame):
    def __init__(self, width=200, height=200):
        Frame.__init__(self, root)
        self.canvas = Canvas(self)
        self.canvas.pack(fill="both", expand="1")
        self.canvas.create_rectangle(50, 25, 150, 75, fill="bisque", tags="r1")
        self.canvas.create_line(0,0, 50, 25, arrow="last", tags="to_r1")
        self.canvas.bind("<B1-Motion>", self.move_box)
        self.canvas.bind("<ButtonPress-1>", self.start_move)

    def move_box(self, event):
        deltax = event.x - self.x
        deltay = event.y - self.y
        self.canvas.move("r1", deltax, deltay)
        coords = self.canvas.coords("to_r1")
        coords[2] += deltax
        coords[3] += deltay
        self.canvas.coords("to_r1", *coords)
        self.x = event.x
        self.y = event.y

    def start_move(self, event):
        self.x = event.x
        self.y = event.y

root = Tk()
canvas = CanvasDemo(root)
canvas.pack()
mainloop()

نصائح أخرى

Tkinter جيد تمامًا لهذا النوع من التطبيقات. في الماضي ، عملت على أدوات كانت صناديق متصلة بالسهام التي بقيت على اتصال أثناء تحريك الصناديق حولها (وهو ما أعتقد أنك تسأل عنه). لا تدع الأشخاص الذين لا يعرفون الكثير عن Tkinter يؤثر عليك - إنها مجموعة أدوات رائعة تمامًا والقماش مرن للغاية.

الحل لمشكلتك هو الرياضيات البسيطة. تحتاج فقط إلى حساب إحداثيات حواف أو زوايا الصناديق لمعرفة مكان ترسيخ الأسهم. لجعلها "تنمو" كما تقول ، ما عليك سوى جعل الربط على حركات الماوس وتحديث الإحداثيات بشكل مناسب.

لجعل الخط قابلاً للنمو ، كل ما عليك فعله هو ضبط إحداثيات الخط في كل مرة يتحرك فيها الماوس. أسهل شيء يجب القيام به هو الاستفادة الليبرالية لعلامات القماش. باستخدام العلامات التي يمكنك معرفة الأسهم التي تتصل بها الصناديق بحيث تقوم عند تحريك المربع ، تقوم بضبط إحداثيات أي سهام تشير إلى أو منها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top