我正在将 gtk.Table 与 EventBox 结合使用,以便为每个单元格绘制彩色网格。在尝试了一个最小的例子后,我发现窗口是实际表的两倍。此外,当应用程序运行时,无法进一步缩小窗口。
似乎有些事情发生了可怕的错误,但我无法找出原因。这是重现不良行为的最小例子:
#!/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()
答案 0 :(得分:2)
事实证明你的event_box.set_border_width(25)
伤害了。如果您只想平均分隔标签,请使用GtkTable::attach
的填充参数。
以下是无关的改进:
请勿将gtk_main_quit
与delete-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