Python - 如何将gtk.DrawingArea缩放为适合gtk.Window的宽度和高度?

时间:2013-12-10 10:56:44

标签: python gtk pygtk

我将这个gtk.DrawingArea置于gtk.Window中,但是当它运行时,它的宽度和宽度不是100%缩放。

enter image description here

以下代码未执行适合gtk.Window的100%宽度/高度比例。知道如何获得预期的结果吗?

  def main(self, screenSaverPicture):    

    self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.w.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0, 0))

    self.w.set_size_request(1024, 768)

    self.w.set_border_width(0)
    self.w.set_decorated(False)
    self.w.set_title("Screen Saver Screen Locked")        
    self.w.move(0,0)
    #self.w.resize(66,66)

    self.w.set_name("main window")    

    # screenSaverPicture = pictures png or jpeg files shown on the screen 
    self.drawing =  gtk.DrawingArea
    self.drawing.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color('#000000'))   

    self.drawing.connect ('button-press-event',self.callback)
    self.drawing.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK| gtk.gdk.POINTER_MOTION_HINT_MASK )

    self.w.add(self.drawing)

    self.w.show_all()
    self.w.connect("destroy", gtk.main_quit)
    gtk.main()

编辑:尝试但也一样

self.vbox = gtk.VBox() 
self.vbox.pack_start(self.drawing, expand=True) 
#or self.vbox.pack_start(self.drawing, expand=False) 
self.w.add(self.vbox)

self.vbox = gtk.Fixed()
self.vbox.put(self.drawing, 0,0)
self.drawing.size_request()
self.drawing.size_allocate(gtk.gdk.Rectangle(0,0,1024,768))  
self.w.add(self.vbox)

2 个答案:

答案 0 :(得分:2)

不要设置静态大小,也不要在main__init__

中绘制

相反,在expose-event回调中获取大小,并根据小部件的当前大小绘制该回调。

这样的事情(你的代码不完整,所以我无法测试)

  def main(self, screenSaverPicture):    

    self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)

    self.w.set_border_width(0)
    self.w.set_decorated(False)
    self.w.set_title("Screen Saver Screen Locked")        
    self.w.move(0,0)
    #self.w.resize(66,66)

    self.w.set_name("main window")    

    # screenSaverPicture = pictures png or jpeg files shown on the screen 
    self.drawing =  gtk.DrawingArea(...) ## FIXME
    self.drawing.connect('expose-event', self.onExposeEvent)

    self.drawing.connect ('button-press-event', self.callback)
    self.drawing.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK| gtk.gdk.POINTER_MOTION_HINT_MASK )

    self.w.add(self.drawing)

    self.w.show_all()
    self.w.connect("destroy", gtk.main_quit)
    gtk.main()
  def onExposeEvent(self, widget, event):
    x, y, w, h = widget.allocation
    cr = widget.get_window().cairo_create()
    cr.rectangle(0, 0, w, h)
    cr.set_source_rgb(0, 0, 0)
    cr.fill()

答案 1 :(得分:2)

请下次提供一个可运行的例子,必须编写缺失的部分并评论不相关的部分,这很无聊。

这是一个应该有效的例子。基本上,您提供的代码甚至没有您说的问题。您的初始样本的主要问题是您为GtkDrawingArea设置了黑色背景,而不是蓝色背景。

import gtk

class Test:

    def main(self):
        self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.w.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0, 0))
        self.drawing =  gtk.DrawingArea()
        self.drawing.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color('#0000ff'))   
        self.w.add(self.drawing)
        self.w.show_all()
        self.w.connect("destroy", gtk.main_quit)
        gtk.main()

if __name__ == '__main__':
    a = Test()
    a.main()