PyGTK - คลาส DrawingArea
วิดเจ็ต DrawingArea จะแสดงผืนผ้าใบว่างที่มี gtk.gdk หน้าต่างที่สามารถวาดวัตถุเช่นเส้นสี่เหลี่ยมส่วนโค้ง ฯลฯ ได้
PyGTK ใช้ห้องสมุดไคโรสำหรับการวาดภาพดังกล่าว ไคโรเป็นไลบรารีกราฟิกเวกเตอร์ 2 มิติยอดนิยม เขียนด้วยภาษา C. แม้ว่าจะมีการผูกในภาษาส่วนใหญ่เช่น C ++, Java, Python, PHP เป็นต้นไลบรารี Cairo สามารถใช้เพื่อวาดบนอุปกรณ์เอาต์พุตมาตรฐานในระบบปฏิบัติการต่างๆ นอกจากนี้ยังสามารถใช้เพื่อสร้าง PDF, SVG และไฟล์โพสต์สคริปต์
ในการดำเนินการวาดภาพที่แตกต่างกันเราต้องดึงข้อมูลอุปกรณ์ด้วยข้อความของวัตถุเอาต์พุตเป้าหมาย ในกรณีนี้เนื่องจากรูปวาดปรากฏบนวิดเจ็ต gtk.DrawingArea จึงได้รับบริบทอุปกรณ์ของ gdk.Window ที่อยู่ภายใน คลาสนี้มีไฟล์cairo-create() วิธีที่ส่งคืนบริบทอุปกรณ์
area = gtk.DrawingArea()
dc = area.window.cairo_create()
วิดเจ็ต DrawingArea สามารถเชื่อมต่อกับการโทรกลับตามสัญญาณต่อไปนี้ที่ปล่อยออกมา -
ตระหนัก | เพื่อดำเนินการที่จำเป็นเมื่อวิดเจ็ตถูกสร้างอินสแตนซ์บนจอแสดงผลเฉพาะ |
config_event | เพื่อดำเนินการที่จำเป็นเมื่อวิดเจ็ตเปลี่ยนขนาด |
expose_event | ในการจัดการการวาดใหม่เนื้อหาของวิดเจ็ตเมื่อพื้นที่วาดภาพปรากฏบนหน้าจอเป็นครั้งแรกหรือเมื่อหน้าต่างอื่นปิดทับแล้วเปิดออก (เปิดเผย) |
นอกจากนี้ยังสามารถใช้เหตุการณ์เมาส์และคีย์บอร์ดเพื่อเรียกใช้การโทรกลับโดย add_events() method ของ gtk.Widget class.
สิ่งที่น่าสนใจเป็นพิเศษคือสัญญาณแสดงเหตุการณ์ซึ่งถูกปล่อยออกมาเมื่อผืนผ้าใบ DrawingArea ปรากฏขึ้นครั้งแรก วิธีการต่างๆในการวาดวัตถุ 2 มิติที่กำหนดไว้ในไลบรารีไคโรถูกเรียกจากการเรียกกลับนี้ที่เชื่อมต่อกับสัญญาณแสดงเหตุการณ์ วิธีการเหล่านี้วาดวัตถุที่เกี่ยวข้องบนบริบทอุปกรณ์ไคโร
ต่อไปนี้เป็นวิธีการวาดที่ใช้ได้ -
dc.rectangle (x, y, w, h) - วาดรูปสี่เหลี่ยมผืนผ้าที่พิกัดด้านซ้ายบนที่ระบุและมีความกว้างและความสูง givwn
dc.arc (x, y, r, a1, a2) - วาดส่วนโค้งวงกลมที่มีรัศมีที่กำหนดและสองมุม
dc.line (x1, y1, x2, y2) - วาดเส้นระหว่างพิกัดสองคู่
dc.line_to (x, y) - ลากเส้นจากตำแหน่งปัจจุบันไปที่ (x, y)
dc.show_text (str) - ดึงสตริงที่ตำแหน่งเคอร์เซอร์ปัจจุบัน
dc.stroke () - วาดโครงร่าง
dc.fill () - เติมรูปร่างด้วยสีปัจจุบัน
dc.set_color_rgb (r, g, b) - กำหนดสีให้เป็นโครงร่างและเติมค่า r, g และ b ระหว่าง 0.0 ถึง 1.0
ตัวอย่าง
สคริปต์ต่อไปนี้วาดรูปทรงต่างๆและทดสอบโดยใช้วิธีไคโร
import gtk
import math
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("Basic shapes using Cairo")
self.set_size_request(400, 250)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
darea = gtk.DrawingArea()
darea.connect("expose-event", self.expose)
self.add(darea)
self.show_all()
def expose(self, widget, event):
cr = widget.window.cairo_create()
cr.set_line_width(2)
cr.set_source_rgb(0,0,1)
cr.rectangle(10,10,100,100)
cr.stroke()
cr.set_source_rgb(1,0,0)
cr.rectangle(10,125,100,100)
cr.stroke()
cr.set_source_rgb(0,1,0)
cr.rectangle(125,10,100,100)
cr.fill()
cr.set_source_rgb(0.5,0.6,0.7)
cr.rectangle(125,125,100,100)
cr.fill()
cr.arc(300, 50, 50,0, 2*math.pi)
cr.set_source_rgb(0.2,0.2,0.2)
cr.fill()
cr.arc(300, 200, 50, math.pi,0)
cr.set_source_rgb(0.1,0.1,0.1)
cr.stroke()
cr.move_to(50,240)
cr.show_text("Hello PyGTK")
cr.move_to(150,240)
cr.line_to(400,240)
cr.stroke()
PyApp()
gtk.main()
สคริปต์ด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -