[英]Python - how to put gtk.DrawingArea scaled fit with gtk.Window width and height?
我有这个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)
不要设置静态大小,也不要在main
或__init__
绘制
相反,在expose-event
回调中获取大小,并根据widget的当前大小绘制该回调。
像这样的东西(你的代码不完整所以我无法测试)
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()
请下次,提供一个可运行的示例,必须编写缺失的部分并评论不相关的内容,这很无聊。
这是一个应该有用的例子。 基本上,您提供的代码甚至没有您说的问题。 初始样本的主要问题是您为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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.