在gtk.widget下创建gtk.window

0 投票
1 回答
1256 浏览
提问于 2025-04-15 23:03

我想在一个gtk.widget下面显示一个gtk.Window。

但是我不知道怎么获取这个gtk.widget的位置坐标来放我的gtk.window。

有人知道吗?

谢谢。

1 个回答

0

你可以使用 gtk.Widget 的 "window" 属性来获取与之关联的 gtk.gdk.Window。然后可以查看 get_origin() 方法来获取屏幕上的坐标。

这些坐标是针对最顶层窗口的,我认为是这样(可能我错了,但我下面的代码似乎支持这个说法)。你可以使用 get_allocation() 方法来获取一个控件相对于其父控件的坐标。

这个想法我是在 这里 得到的。不过要注意:有些窗口管理器会忽略窗口位置的初始设置。你可能想看看 这篇帖子 获取更多信息,但我个人没有去查看过。

你是想创建另一个顶层窗口吗?还是一个弹出窗口?

#!/usr/bin/env python
import sys

import pygtk
import gtk

class Base:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.connect("destroy", self.on_destroy)

        self.box = gtk.VButtonBox()

        self.buttons = [
            gtk.Button("Test 1"),
            gtk.Button("Test 2"),
            gtk.Button("Test 3")
        ]

        for button in self.buttons:
            self.box.add(button)
            button.connect("clicked", self.show_coords)
            button.show()

        self.window.add(self.box)

        self.box.show()
        self.window.show()

    def show_coords(self, widget, data=None):
        print "Window coords:"
        print self.window.get_window().get_origin()
        print "Button coords:"
        print widget.get_allocation()

    def on_destroy(self, widget, data=None):
        gtk.main_quit()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    base = Base()
    base.main()

撰写回答