为什么gtk.Table占用的空间是它应该的两倍?

时间:2017-01-11 22:29:09

标签: python gtk

我正在将 gtk.Table EventBox 结合使用,以便为每个单元格绘制彩色网格。在尝试了一个最小的例子后,我发现窗口是实际表的两倍。此外,当应用程序运行时,无法进一步缩小窗口。

enter image description here

似乎有些事情发生了可怕的错误,但我无法找出原因。这是重现不良行为的最小例子:

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk

class MyProgram:

    def __init__(self):
        app_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        app_window.set_border_width(10)
        app_window.connect("delete_event", lambda w,e: gtk.main_quit())
        vbox_app = gtk.VBox(False, 0)
        table_layout = gtk.Table(rows=1,columns=1, homogeneous=True)
        for col in range(1,10):
                for row in range(1,5):
                        event_box = gtk.EventBox()
                        label_day = gtk.Label("")
                        label_day.set_size_request(18,18)
                        label_day.show()
                        event_box.add(label_day)
                        event_box.modify_bg(gtk.STATE_NORMAL,
                                event_box.get_colormap().alloc_color("orange"))
                        event_box.set_border_width(25)
                        event_box.show()
                        table_layout.attach(event_box, 0, col, 0, row, 0,0,0,0)
        vbox_app.pack_start(table_layout)
        app_window.add(vbox_app)
        app_window.show_all()
        return

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    MyProgram()
    main()

1 个答案:

答案 0 :(得分:2)

事实证明你的event_box.set_border_width(25)伤害了。如果您只想平均分隔标签,请使用GtkTable::attach的填充参数。

以下是无关的改进: 请勿将gtk_main_quitdelete-event信号连接,而是将其连接到destroy信号。 delete-event是你想要在退出之前做某事的时候(例如,显示一个弹出框"你确定吗?是/否"),但你想要的是在窗口真的时退出gtk破坏。

此外,不是在表格中添加小部件时添加小部件,而是附加它们并使用从0开始的范围,以便更容易看到小部件的添加位置(表格中的索引从零开始) )。

至于你的VBox,在这种情况下,它是无用的。如果您只拥有内容占据整个窗口的窗口小部件,只需将其直接添加到您的GtkWindow(但在我们未提取的程序版本中可能需要它)。

最后,您不需要在每个小部件上调用gtk_widget_show。只需专注于构建窗口小部件层次结构,然后在顶层窗口上运行gtk_widget_show_all。它会以递归方式显示其中的所有小部件。

这最终给了我们:

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk

class MyProgram:

    def __init__(self):
        app_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        app_window.set_border_width(10)
        app_window.connect('destroy', lambda w: gtk.main_quit())
        table = gtk.Table(rows=1, columns=1, homogeneous=True)

        for col in range(0,9):
            for row in range(0,4):
                event_box = gtk.EventBox()
                label_day = gtk.Label('')
                label_day.set_size_request(18, 18)
                event_box.add(label_day)
                event_box.modify_bg(gtk.STATE_NORMAL,
                        event_box.get_colormap().alloc_color("orange"))
#                event_box.set_border_width(25)
                table.attach(event_box, col, col + 1, row, row + 1, 0, 0, 12, 12)
        app_window.add(table)
        app_window.show_all()


if __name__ == '__main__':
    MyProgram()
    gtk.main()

您还有一个名为gtk-inspector的工具,但我不知道它是否适用于GTK 2.如果没有,请回退gtk-parasite。这些工具将帮助您分析正在运行的gtk用户界面并查看其小部件的特征。

此外,GTK 3已经推出几年了,GTK 4已经上路了。考虑使用GTK 3获取新代码。它不再使用pygtk,而是使用pygobject而不是gi包(GObject introspection)。

这是python官方教程中的GTK 3:

https://python-gtk-3-tutorial.readthedocs.io/en/latest/index.html