【问题标题】:unable to draw correctly in Gtk+3无法在 Gtk+3 中正确绘制
【发布时间】:2014-07-17 02:10:51
【问题描述】:

我可以在单个 Gtk.DrawingArea 中绘制,但是当我尝试绘制多个,例如 50 个时,我在绘制时遇到了一些错误。 p>

这是您需要检查的代码:

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(s) 只有在我更新窗口时才会改变颜色(例如我从程序切换到 Gtk.DrawingArea 窗口)?

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

【问题讨论】:

    标签: gtk drawing pygtk gtk3 drawingarea


    【解决方案1】:
    1. 无法帮助您解决此问题
    2. 因为它只在 Gtk.DrawingArea 重新绘制自身时改变颜色(“draw”信号)
    3. r,g,b 应该在“draw”函数中。您确实构造了 r,g,b,但由于它在绘图函数之外,因此在重新绘制区域时它没有改变。
    4. 为什么要睡觉?

    ** 已编辑 **

    示例代码:

      ....
      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,我调用“.show()”方法每 1 秒。对于他们每个人4),因为如果绘图每 1 秒发生一次,我可能更容易看到更新。谢谢
    • 2)。由于 Gtk.DrawingArea 是顶层的子级,当窗口重新绘制自身时,所有子级也必须被绘制。否则,您的绘图区域如何分配宽度和高度? 4).明白了。我会考虑的......和啊......对不起,我虽然你在 1 个绘图区域内创建了 50 个矩形......你在 1 个窗口中做了 50 个绘图区域
    • 编辑了答案。我使用按钮刷新,你可能使用超时或其他东西
    • 好的,非常感谢!现在我必须解决1)。仅当我向下/向上滚动窗口时才会发生这种情况
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 2012-10-05
    • 2023-01-06
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多