问题描述
我刚刚开始使用 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)
...