3

我实际上正在开发一个相对复杂的 GTK+2 应用程序。我的应用程序显然有一个主窗口;那么我需要打开一个新的“独立”窗口。

我需要将“飞行”窗口放置在屏幕的*精确位置*,正好在小部件(绘图区)的顶点处。我需要将新窗口放置在屏幕的精确位置,正好在小部件的顶点(gtk.DrawingArea)。

所以我想到了以下算法:

  1. 我得到DrawingArea 的顶点坐标(相对于父窗口);

  2. 然后,我将相对坐标转换为屏幕上的绝对坐标;

  3. 最后,我可以简单地将窗口移动到屏幕上所需的位置,即 gtk.DrawingArea 的顶点上。这样对吗?

不幸的是,我不能把这个算法翻译成代码。ps 我正在使用Python 2.7Gtk+2.24;尽管如此,也欢迎 C/C++ 示例。

4

1 回答 1

1

我不确定这是否是您想要的,请尝试:

#!/usr/bin/env python3


from gi.repository import Gtk


class Demo:

    def __init__(self):
        self.window = Gtk.Window()
        self.window.set_title('Demo')
        self.window.set_default_size(300, 300)
        self.window.set_border_width(5)
        self.window.connect('delete-event', self.on_app_exit)

        hbox = Gtk.Box()
        hbox.set_halign(Gtk.Align.CENTER)
        hbox.set_valign(Gtk.Align.CENTER)
        self.window.add(hbox)

        da = Gtk.DrawingArea()
        da.set_size_request(100, 100)
        hbox.pack_start(da, False, False, 5)

        button = Gtk.Button('Show')
        button.connect('clicked', self.on_button_clicked, da)
        hbox.pack_start(button, False, False, 5)

        self.second_win = Gtk.Window()
        self.second_win.set_title('flying window')
        # You may also want to remove window decoration.
        #self.second_win.set_decorated(False)

        label = Gtk.Label('second window')
        self.second_win.add(label)


    def run(self):
        self.window.show_all()
        Gtk.main()

    def on_app_exit(self, widget, event=None):
        Gtk.main_quit()

    def on_button_clicked(self, button, da):
        allocation = da.get_allocation()
        self.second_win.set_default_size(allocation.width, 
                allocation.height)
        pos = self.window.get_position()
        self.second_win.move(pos[0] + allocation.x, pos[1] + allocation.y)
        self.second_win.show_all()


if __name__ == '__main__':
    demo = Demo()
    demo.run()

和截图:

截屏

于 2013-06-02T05:58:05.687 回答