【问题标题】:Python - how to put gtk.DrawingArea scaled fit with gtk.Window width and height?Python - 如何将 gtk.DrawingArea 缩放适合 gtk.Window 的宽度和高度?
【发布时间】:2013-12-11 02:11:33
【问题描述】:

我将这个 gtk.DrawingArea 放在 gtk.Window 中,但是当它运行时,它不是 100% 缩放适合 gtk.Widnow 的高度和宽度。

以下代码未对 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)

【问题讨论】:

  • 你能试试self.w.pack_start(self.drawing)吗?我好像记得那是我前一阵子用的。
  • @SimonVisser: AttributeError: 'gtk.Window' 对象没有属性 'pack_start'
  • 不工作。刚试过:self.vbox = gtk.VBox() self.vbox.pack_start(self.drawing, expand=True) self.w.add(self.vbox)
  • 首先,您是否要调整窗口大小并自动调整DrawingArea的大小并同时保持比例?
  • @ilius: 是的,但仍然是可选的,因为此窗口不会总是调整大小

标签: python gtk pygtk


【解决方案1】:

下次请提供一个可运行的示例,必须编写缺少的部分并注释无关的部分很无聊。

这是一个应该有效的示例。基本上,您提供的代码甚至没有您所说的问题。初始示例的主要问题是您为 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()

【讨论】:

  • 首先确保您使用'#0000ff' 作为绘图区域的背景颜色,而不是'#000000'。然后我必须修复最后缺少()self.drawing = gtk.DrawingArea
  • 我已经修改了示例,很难更短,除非我删除了虚假的 Test 类,但它是为了让您继续调用 self 对象。
  • 请下载:1) paste.ubuntu.com/6555348 2) 播放任何 avi、flv 或任何视频文件或 jpeg 或 png 3) 你会注意到 gtk.Window 和 gtk.DrawingArea 是黑色和蓝色但内容区域不是 100% 宽度缩放
  • 您是否意识到您还没有告诉我们涉及 vlc 的事实? libvlc 可能只是通过尊重其纵横比来播放您的视频,这可能与您的显示器不同。使用与显示器具有相同纵横比的视频,或检查如何使用 libvlc 拉伸视频。但这与 GTK 完全无关。
【解决方案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()

【讨论】:

  • 它还是一样的,就像你提到的那样。但保持和以前一样。
  • 请粘贴您正在测试的完整代码(或可以执行的部分代码)
猜你喜欢
  • 2013-11-05
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多