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()

สคริปต์ด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -