2009-06-06 24 views
8

Tôi có một hình ảnh/pixbuf mà tôi muốn vẽ thành một gtk.DrawingArea và làm mới thường xuyên, do đó thao tác nhấp nháy phải nhanh. Làm theo cách dễ dàng:Cách nhanh nhất để vẽ hình ảnh trong Gtk + là gì?

def __init__(self): 
    self.drawing_area = gtk.DrawingArea() 
    self.image = gtk.gdk.pixbuf_new_from_file("image.png") 

def area_expose_cb(self, area, event): 
    self.drawing_area.window.draw_pixbuf(self.gc, self.image, 0, 0, x, y) 

Tuy nhiên dẫn đến hiệu suất rất chậm, có thể do pixbuf không có định dạng màu hiển thị.

Tôi cũng không thành công với Cairo, vì nó dường như bị giới hạn ở định dạng 24/32bit và không có định dạng 16bit (FORMAT_RGB16_565 không được hỗ trợ và không dùng nữa).

Có những lựa chọn thay thế nào để vẽ ảnh nhanh chóng trong Gtk +?

Trả lời

6

Thử tạo Pixmap sử dụng cùng một bản đồ màu làm vùng vẽ của bạn.

dr_area.realize() 
self.gc = dr_area.get_style().fg_gc[gtk.STATE_NORMAL] 
img = gtk.gdk.pixbuf_new_from_file("image.png") 
self.image = gtk.gdk.Pixmap(dr_area.window, img.get_width(), img.get_height()) 
self.image.draw_pixbuf(self.gc, img, 0, 0, 0, 0) 

và vẽ nó vào màn hình sử dụng

dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size()) 
2

Bạn có thực sự không tạo đủ tốc độ/thông lượng thô không? Hay chỉ là bạn đang thấy nhấp nháy?

Nếu đó là sau này, có lẽ bạn nên điều tra bộ đệm đôi để hoàn thành cập nhật của mình thay thế? Về cơ bản ý tưởng là để vẽ một bộ đệm vô hình sau đó nói với card đồ họa để sử dụng bộ đệm mới.

Có thể xem trang này có một số information on double buffering.

+0

Thông lượng không nhấp nháy. Tôi đang cố gắng để làm một số tương tác toàn màn hình cuộn/animtion trên OLPC, mà không phải là rất nhanh để bắt đầu và có một màn hình khá lớn trên đó và nó chạy trong 16bit. Làm điều tương tự trong SDL hoạt động mà không có vấn đề gì. Sử dụng gtk.Layout và sử dụng để cuộn nhanh, nhưng thực hiện cuộn theo cách thủ công bằng cách vẽ đến gtk.DrawingArea (vì tôi có thể muốn thêm các hiệu ứng khác sau) hoàn toàn không sử dụng được. – Grumbel

0

Nó có thể là giá trị thực hiện một số điểm chuẩn - nếu bạn vẽ với một khu vực nhỏ là nó vẫn còn chậm?

Nếu có, bạn có thể yêu cầu danh sách gửi thư pygtk hoặc gtk ...

Các vấn đề liên quan