开发者

How draw on gtk window without generating expose event

I am doing a project in PyGtk for monitoring a performance of system. I have developed almost of the code for purpose.But now i have a problem in it. My problem is that i am repainting all my stuff on expose-event and i want to draw on window without generating expose event.Reason for that is, i am plotting a graph on expose-event,but when i resize window it is not showing the perfect reading, i want to plot graph when window is idle and window is not resizing and when window gets resize it should not plot a graph.I tried for configure event but doesn't success to me. please help me. Please reply me soon. thank you

here is my complete code:

import pygtk
pygtk.require(`2.0`)
import gtk
import cairo
import gobject
import random, sys, thread, time
from gtk import gdk

class Monitor(gtk.DrawingArea):

        ##__gsignals__ = {
                        ##"configure-event" : "override"
                        ##}

        count = 0
        coord = []
        mem_coord = []
        x1, y1 = 0, 0
        str1 = []
        max_mem = 0
        mem_usage = 0
        name = ""
        G = 2
        def __init__(self,parent,name):


                super(Monitor,self).__init__()
                self.coord.append(0)
                self.connect("expose-event",self.do_on_expose)
                self.name = name                        
                gobject.timeout_add(1000,self.draw_loop)

        def get_mem_data(self):
                f = open("/proc/meminfo","r")
                str2 = f.readline().split(" ")[:]
                self.max_mem = int(str2[len(str2)-2])
                for i in range(5):
                        str2 = f.readline().split(" ")[:]
                str3 = int(str2[len(str2)-2])
                f.close()
                return str3

        def get_mem_usage(self):
                self.mem_usage = self.get_data()
                val = (self.mem_usage * 100) / self.max_mem
                return val

        def get_cpu_data(self):

                f = open("/proc/stat","r")
                str2 = f.readline().split(" ")[2:6]
                f.close()
                for i in range(len(str2)):
                        str2[i] = int(str2[i])                
                return str2

        def get_cpu_usage(self):
                str2 = self.get_data()
                for i in range(len(self.str1)):
                        self.str1[i] = str2[i] - self.str1[i]        
                val = 100 - (self.str1[len(self.str1) - 1] * 100.00 / sum(self.str1))
                for i in range(len(self.str1)):
                        self.str1[i] = str2[i]        
                return val

        def draw_loop(self):
                self.queue_draw()
                return True

        def do_configure_event(self, event):

                self.cr=self.window.cairo_create()
                self.draw_grid(self.G)
                self.draw_graph()
                gtk.Window.do_configure_event(self, event)

        def do_on_expose(self,widget,event):
                self.cr=widget.window.cairo_create()
                self.draw_grid(self.G)
                self.draw_graph()

        def draw_graph(self):

                val = random.randint(1,100)##self.get_usage(self.resource)    ##random.randint(1,100)     
                print "val = ",val           
                if self.count<256 :
                        self.count=self.count+1
                        self.coord.append(val)
                else:
                        self.coord.pop(0)
                        self.coord.append(val)

                val = (self.y1+self.y2-3) - ((val*(self.y2-6))/100)


                x=self.x1 + self.x2 - 3
                self.cr.move_to(x,val)
                self.cr.set_source_rgb(255,0,0)

                for i in range(self.count,-1,-1):
                        if x > self.x1+3:
                                val = (self.y1+self.y2-3) - ((self.coord[i]*(self.y2-6))/100)
                            开发者_如何学C    self.cr.line_to(x,val)
                                self.cr.move_to(x,val)
                                x=x-5
                        else:
                                break

                self.cr.stroke()
                return False

        def draw_grid(self,G):
                size=self.window.get_size()
                height = (size[1] / G) - 30
                self.x1, self.y1 = 20, 20
                self.x2, self.y2 = size[0]-(2*self.x1), height
                x1, y1, x2, y2 = self.x1, self.y1, self.x2, self.y2
                for i in range(G):
                    self.cr.set_source_rgb(0,0,0)
                    self.cr.rectangle(x1,y1,x2,y2)
                    self.cr.fill()
                    self.cr.stroke()
                    self.cr.set_source_rgb(0,255,0)
                    x3 = x2 - 6
                    y3 = y2 - 6
                    self.cr.rectangle(x1+3,y1+3,x3,y3)
                    self.cr.stroke()
                    x = x1 + 3
                    y = y1 + y2 - 3 
                    fraction = int( round( x3 / 12.34 ) )
                    split = float(x3) / float(fraction)  
                    self.cr.set_source_rgba(0,255,0,0.3)
                    for i in range(fraction):
                        x = x + split
                        self.cr.move_to(x,y1+3)
                        self.cr.line_to(x,y)
                    self.cr.stroke()

                    x = x1 + x2 - 3
                    y = y1 + 3 
                    fraction = int( round( y3 / 12.34 ) )
                    split = float(y3) / float(fraction)  
                    self.cr.set_source_rgba(0,255,0,0.3)
                    for i in range(fraction):
                        y = y + split
                        self.cr.move_to(x1+3,y)
                        self.cr.line_to(x,y)
                    self.cr.stroke()
                    y1 = y1 + y2 + 20






class main(gtk.Window):
        __gsignals__ = {
                        "configure-event" : "override"
                        }

        def __init__(self):
                super(main,self).__init__()
                self.set_title("Virtual Machine Monitor")
                self.set_default_size(640,640)
                self.set_resizable(True)
                self.set_geometry_hints(min_width=640,min_height=500)
                self.set_position(gtk.WIN_POS_CENTER)
                self.connect("delete_event",gtk.main_quit)
                ##self.maximize()
                vbox=gtk.VBox(False,1)
                self.monitor2=Monitor(self,"MEM")
                ##self.monitor3=Monitor(self,"MEM")
                vbox.pack_start(self.monitor2,1,1,0)
                ##vbox.pack_start(self.monitor3,1,1,0)
                self.add(vbox)
                self.show_all()

        def do_configure_event(self, event):

                title = "%s, %s" % (event.x, event.y)
                ##self.set_title(title)
                gtk.Window.do_configure_event(self, event)


if __name__ == "__main__":
        main()
        gtk.main()


You could use the freeze_updates and thaw_updates methods of GTK:

# GTK Imports
import gtk

gdkwindow=mywindow.window
if gdkwindow:
    gdkwindow.freeze_updates()

# Do cairo drawing operations here


if gdkwindow:
    gdkwindow.thaw_updates()

window.queue_draw()

Look for that methods in gdk.window documentation at PyGTK


You might try .hide'ing the window before drawing on it, and thus generating the expose when you .show it.

The FAQ answer can be found here.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜