无法在Gtk+;中正确绘制;3.

无法在Gtk+;中正确绘制;3.,gtk,drawing,pygtk,gtk3,drawingarea,Gtk,Drawing,Pygtk,Gtk3,Drawingarea,我可以在一个Gtk.DrawingArea中绘制,但当我尝试为许多人(例如50人)绘制时,我在绘制时出现了一些错误 以下是您需要签出的代码: def aggiorna(self, args=()): import random import time while True: for i in self.indirizzi_ip: self.r=random.randint(0,10)/

我可以在一个Gtk.DrawingArea中绘制,但当我尝试为许多人(例如50人)绘制时,我在绘制时出现了一些错误

以下是您需要签出的代码:

def aggiorna(self, args=()):

        import random
        import time


        while True:
            for i in self.indirizzi_ip:
                self.r=random.randint(0,10)/10.0
                self.g=random.randint(0,10)/10.0
                self.b=random.randint(0,10)/10.0
                self.cpu_info[i]['drawing_area'].show() #the drawing happens here

            time.sleep(1)


    def __draw(self, widget, context): #connected to Gtk.DrawingArea.show()

        context.set_source_rgb(self.r, self.g, self.b) #random
        context.rectangle(0, 0, widget.get_allocated_width(), widget.get_allocated_height())
        context.fill()
1) 为什么我会在绘图时出错

2) 为什么Gtk.DrawingArea仅在我更新窗口时才更改颜色(例如,我从程序切换到Gtk.DrawingArea窗口)

3) 为什么我不能为每个Gtk.DrawingArea获得随机颜色

  • 这件事我帮不了你
  • 因为它只在Gtk.DrawingArea重新绘制自身时改变颜色(“绘制”信号)
  • r、g、b应位于“绘制”功能内。您确实构造了r、g、b,但由于它在draw函数之外,所以在区域重新绘制时它没有改变
  • 为什么要睡觉
  • **编辑**

    示例代码:

      ....
      win = Gtk.Window ()
      box = Gtk.Box ()
      self.square_list = []
    
      for square in range (10):
        self.darea = Gtk.DrawingArea ()
        self.set_size_request (50,50)
        self.square_list.append (self.darea)
        box.add (self.darea)
    
        #for each darea connect to separate "draw" signal
        self.darea.connect ("draw", self,_draw)
    
      aggiorna_button = Gtk.Button ('Aggiorna!!!') #sorry i use button
      box.add (aggiorna_button)
      aggiorna.button.connect ("clicked", self.aggiorna)
    
    def _draw (self, widget, cr):
        r = random.randint (0,10)/10.0
        g = random.randint (0,10)/10.0
        b = random.randint (0,10)/10.0
        cr.set_source_rgb (r,g,b)
        cr.rectangle (0,0, widget.get_allocated_width(), widget.get_allocated_height())
        cr.fill ()
    
    def aggiorna (self, widget):
       for darea in self.square_list:
            darea.queue_draw()
    

    2) 请记住,“draw”信号不是连接到顶级Gtk.Window,而是连接到Gtk.DrawingArea,我每1秒调用一次“.show()”方法。因为如果每1秒绘制一次,我就更容易看到更新。谢谢。由于Gtk.DrawingArea是toplevel的子级,因此当窗口重新绘制自身时,必须同时绘制所有子级。否则,如何分配绘图区域的宽度和高度?4) .明白了。我会考虑的。。。。啊…抱歉,我以为你在一个绘图区域内创建了50个矩形…你在一个窗口中创建了50个绘图区域编辑了答案。我用按钮刷新,你可能用了超时或者其他什么。谢谢!现在我必须解决1)。只有在向下/向上滚动窗口时才会发生这种情况