【问题标题】:Gtk.Grid(): how to dynamically modify the number of rowsGtk.Grid():如何动态修改行数
【发布时间】:2015-11-22 17:52:26
【问题描述】:

如何从下面更改 simple_table_code,以便可以修改 Gtk.Grid 的行数(例如通过单击其中一个按钮)?

我想我必须从_init__ 中删除网格部分,但我想留下那里的按钮。

当我尝试这样做时,网格根本不显示。另外,除了我使用的方法之外,还有没有更有效的方法来获取单元格边框?

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class MyTable(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Table")
        grid = Gtk.Grid(column_spacing=1,row_spacing=1)
        grid.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(0.0,0.0,0.0,0.5))
        self.add(grid)
        for i in range (5):
            butt=Gtk.Button(label=i)
            butt.connect("clicked",self.on_button_clicked)
            grid.attach(butt,i,1,1,1)
        for i in range (5):
            for y in range(10):
                a=Gtk.Label(label=i)
                a.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(0.95,0.95,0.95,1.0))
                grid.attach(a,i,y+1,1,1)        

win = MyTable()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

【问题讨论】:

    标签: python gtk grid-layout gtk3


    【解决方案1】:

    你正在做的黑客似乎很好,我不知道你的程序会做什么,但你也可以考虑使用Gtk.DrawingArea

    要添加带有按钮的行,请查看以下内容:

    from gi.repository import Gtk, Gdk
    
    class MyTable(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, title="Table")
    
            main_box=Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
    
            button_add_rows=Gtk.Button(label="Add Rows")
            button_add_rows.connect("clicked", self.add_row)
            main_box.add(button_add_rows)
    
            self.grid = Gtk.Grid(column_spacing=1,row_spacing=1)
            self.grid.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(0.0,0.0,0.0,0.5))
            main_box.add(self.grid)
    
            self.number_of_columns=5
            self.number_of_rows=10
    
            self.add(main_box)
    
            for column in range(self.number_of_columns):
                button=Gtk.Button(label=column)
                self.grid.attach(button,column,1,1,1)
    
            for column in range(self.number_of_columns):
                for row in range(self.number_of_rows):
                    a=Gtk.Label()
                    a.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(0.95,0.95,0.95,1.0))
                    self.grid.attach(a,column, row+1,1,1)        
    
    
        def add_row(self, button, data=None):
            for column in range(self.number_of_columns):
                for row in range(self.number_of_rows+1, self.number_of_rows+2):
                    a=Gtk.Label()
                    a.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(0.95,0.95,0.95,1.0))
                    self.grid.attach(a,column, row+1,1,1)
    
            self.grid.show_all()
            self.number_of_rows+=1
    
    
    table_window = MyTable()
    table_window.connect("delete-event", Gtk.main_quit)
    table_window.show_all()
    Gtk.main()
    

    你可以注意到我替换了一些 Gtk.Label(label=column) 宽度 Gtk.Label()。实际上,单元格的 with 已经由第一行按钮给出,并且您正在向单元格插入“不可见”文本,因为字体是白色的,背景也是。如果用户使用黑色文本,表格将填充数字。我认为使用Gtk.DrawingArea 会更好。

    另外,请记住,当您创建 Gtk 小部件时,如果您想看到它,您需要显示它。在这种情况下,我在方法 add_row 上使用了 self.grid.show_all()

    【讨论】:

    • 程序将显示一组数据(取决于单击的按钮),我不确定是否将标签用作单元格 - 例如按钮具有更好的默认操作 - 用户将不要改变它,所以 DrawingArea 可能不是一个好的选择。谢谢(还没有代表给你点)!
    • @mpruchni 你不能给分,但你应该通过点击点下方的箭头来接受答案。它会将问题标记为“已回答”并给您 2 分。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2012-03-16
    相关资源
    最近更新 更多