无法将滚动条添加到 Python GTK3 笔记本中的 TreeView

问题描述

我刚刚开始使用 Python Gtk。 我正在尝试设计一个带有 3 个选项卡的视图(这是使用 Gtk.Notebook() 完成的)。 在其中一个选项卡中,我添加一个 ComboBoxText 和一个 TreeView。 我正在尝试向树视图添加滚动条,但无法这样做。这里是我的代码供参考

import gi 
# Since a system can have multiple versions 
# of GTK + installed,we want to make 
# sure that we are importing GTK + 3. 
gi.require_version("Gtk","3.0") 
from gi.repository import Gtk,Pango

# list of available drivers
drivers_available = [
    "All","drv_ccfl","drv_uart","drv_adc","drv_gpio","drv_ffs","drv_can","drv_pwm","drv_temp","drv_volt","drv_photo","drv_ble","drv_gpu"
    ]
    
# list of tuples for each software,containing the software name,initial release,and main programming languages used
driver_parameters_list = [
    ("drv_ccfl","param1","string","xx" ),("drv_uart","param2","int","10"),("drv_adc","param3","float","9.5"),("drv_gpio","param5","bool","true"),("drv_ffs","param6","0"),("drv_can","param7","54.0"),("drv_pwm","param8","20"),("drv_temp","param9","false"),("drv_volt","param10","xyz"),("drv_photo","param11","abc"),("drv_ble","param12","35.9"),("drv_gpu","param13","24"),("drv_ccfl","param14","45" ),"param15","25"),"param16","yy"),"param17","13.9"),"param18","param19","param20","3.6"),"param21","27"),"00")
    ]

columns = ["Driver_type","Parameter","type","Value"]

class MyWindow(Gtk.Window): 
    def __init__(self): 
        Gtk.Window.__init__(self,title ="Pricol") 
        self.set_border_width(10) 
        #self.set_default_size(1000,200) 
        #self.set_resizable(False)
        
        # Create a Box and add it to the Window widget
        vBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL,spacing=20) 
        vBox.set_property("height-request",500)
        self.add(vBox)
        
        self.notebook = Gtk.Notebook() 
        self.notebook.set_scrollable(True)
        self.notebook.set_show_border(True)
        self.notebook.set_tab_pos(0)
        vBox.pack_start(self.notebook,False,0)
        
        # Add a Box to Page 1 in order to be able to add more widgets
        self.page1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL,spacing=20) 
        
        self.page1.set_border_width(50) 

        # Add a comboBox for the dropdown
        drivers_comboBox = Gtk.ComboBoxText() 
        drivers_comboBox.connect("changed",self.on_drivers_comboBox_changed)
        drivers_comboBox.set_entry_text_column(0) 
        drivers_comboBox.set_wrap_width(1)
        self.page1.add(drivers_comboBox)
        
        # Add drivers in the list
        for driver in drivers_available: 
            drivers_comboBox.append_text(driver) 
            
        drivers_comboBox.set_active(0) 
        
        ##########
        # Create a tree for the driver paramenter list
        # The data in the model (three strings for each row,one for each column        
        listmodel = Gtk.ListStore(str,str,str)
        # append the values in the model
        for i in range(len(driver_parameters_list)):
            listmodel.append(driver_parameters_list[i])
        
        self.driver_filter = listmodel.filter_new()
        self.driver_filter.set_visible_func(self.driver_filter_func)
        
        # a treeview to see the data stored in the model
        view = Gtk.TreeView(model=self.driver_filter)
        # for each column
        for i,column in enumerate(columns):
            # cellrenderer to render the text
            cell = Gtk.CellRendererText()
            # the text in the first column should be in boldface
            if i == 0:
                cell.props.weight_set = True
                #cell.props.weight = Pango.Weight.BOLD
            # the column is created
            col = Gtk.TreeViewColumn(column,cell,text=i)
            col.set_min_width(250)
            # and it is appended to the treeview
            view.append_column(col)
        
        view.set_grid_lines(3)
        
        grid = Gtk.Grid()
        grid.attach(view,1,1)
    
        self.page1.add(grid) 
        ##########
        
        
        # Add Page 1 as a Tab
        self.page1_title = Gtk.Label()
        self.page1_title.set_property("height-request",50)
        self.page1_title.set_markup("<b><big>Drivers</big></b>")
        self.page1_title.set_property("width-request",150)
        self.notebook.append_page(self.page1,self.page1_title ) 
        
                
        # Add a Box to Page 2 in order to be able to add more widgets
        self.page2 = Gtk.Box() 
        self.page2.set_border_width(50) 
        
        # Add widgets to page 2 here
        
        ##
        
        # Add Page 2 as a tab
        self.page2_title = Gtk.Label()
        self.page2_title.set_property("height-request",50)
        self.page2_title.set_markup("<b><big>Data</big></b>")
        self.page2_title.set_property("width-request",150)
        self.notebook.append_page(self.page2,self.page2_title )
        
        
        
        
        # Add a Box to Page 3 in order to be able to add more widgets
        self.page3 = Gtk.Box() 
        self.page3.set_border_width(50) 
        
        # Add widgets to page 3 here
        
        ##
        
        # Add Page 3 as a tab
        self.page3_title = Gtk.Label()
        self.page3_title.set_property("height-request",50)
        self.page3_title.set_markup("<b><big>View</big></b>")
        self.page3_title.set_property("width-request",150)
        self.notebook.append_page(self.page3,self.page3_title )
        
        
    def on_drivers_comboBox_changed(self,combo):
        # we set the current language filter to the button's label
        self.current_filter_driver = combo.get_active_text()
        # we update the filter,which updates in turn the view
        self.driver_filter.refilter()
    
    
    def driver_filter_func(self,model,iter,data):
        """Tests if the language in the row is the one in the filter"""
        if (
            self.current_filter_driver is None
            or self.current_filter_driver == "All"
        ):
            return True
        else:
            return model[iter][0] == self.current_filter_driver
            
    
    def on_selection_button_clicked(self,widget):
        """Called on any of the button clicks"""
        # we set the current language filter to the button's label
        self.current_filter_driver = widget.get_label()
        # we update the filter,which updates in turn the view
        self.driver_filter.refilter()
        
        
        
win = MyWindow() 
win.connect("destroy",Gtk.main_quit) 
# display the window. 
win.show_all() 
# Start the GTK + processing loop 
Gtk.main() 

视图的大小随着列表大小的增加而不断增加。 此外,当我在下拉列表中使用过滤器时,视图会再次调整大小。 有人可以帮我解决这个问题吗?

解决方法

只需在您的视图和网格之间添加 ScrolledWindow

...
        view.set_grid_lines(3)

        scrolled_window = Gtk.ScrolledWindow(vexpand=True,hexpand=True)
        scrolled_window.add(view)
        
        grid = Gtk.Grid()
        grid.attach(scrolled_window,1,1)
    
        self.page1.add(grid) 
...