Из того, что я испытываю, я не могу выделить положение курсора, отрегулировав вес шрифта текущей ячейки с помощью обратного сигнала с измененным курсором И завершить операцию редактирования в редактируемом текстовом рендерере, используя либо рендерер прямого текста, либо рендерер комбинированного списка.
Я написал короткий пример того, что я испытываю в python:
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
import signal
import sys
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GObject
AW = 2000 # active weight (weight used when cursor is on a given cell)
IW = 400 # inactive weight (weight used when cursor is NOT on a given cell)
class TreeViewExample:
def check_sigint(self):
return True
def quit(self):
Gtk.main_quit()
def delete_event(self, widget, data=None):
print "delete_event signal occurred"
self.quit()
return True
def destroy(self, widget, data=None):
print "destroy signal occurred"
self.quit()
def signal_handler(self, signal, frame):
print '\nYou pressed Ctrl+C!, exiting'
Gtk.main_quit()
def clear_selected(self, button):
selection = self.treeview.get_selection()
model, iter = selection.get_selected()
if iter:
model.remove(iter)
return
def window_key_press(self, widget, event):
keyname = Gdk.keyval_name(event.keyval)
# # # ( q )
if keyname == 'q':
# if event.state & Gdk.ModifierType.CONTROL_MASK:
# print 'entered ctrl+q'
self.quit()
def treeview_key_press(self, widget, event):
keyname = Gdk.keyval_name(event.keyval)
# # # ( return )
if keyname == 'Return':
# if event.state & Gdk.ModifierType.CONTROL_MASK:
# print 'entered ctrl+q'
selection = self.treeview.get_selection()
model, iter = selection.get_selected()
path = model.get_path(iter)
if self.treeview.row_expanded(path):
self.treeview.collapse_row(path)
else:
self.treeview.expand_row(path,False)
def cell_edited(self,renderer,path,text,column):
print 'entered cell edited, column: %s, text: %s' % (column,text)
iter = self.treestore.get_iter(path)
self.treestore[iter][column] = text
def cursor_changed(self,widget):
print 'entered cursor changed'
selection = self.treeview.get_selection()
(model, iter) = selection.get_selected()
path,col = widget.get_cursor()
if col and iter:
try:
col_num = int(col.get_title())
except:
return
for i in range(2,4):
model.set(iter,i,IW)
model.set(iter,col_num+2,AW)
def __init__(self):
# Create a new window
self.window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
self.window.set_title("Lists")
self.window.set_size_request(200, 200)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.connect('key_press_event', self.window_key_press)
choices = Gtk.ListStore(int,str)
for i in range(4):
choices.append([i,('test %s' % i)])
self.treestore = Gtk.TreeStore(str,str,int,int)
for parent in range(4):
piter = self.treestore.append(None, ['parent %i' % parent,('blah %s' % i),IW,IW])
self.treeview = Gtk.TreeView(self.treestore)
self.treeview.connect('key_press_event', self.treeview_key_press)
self.treeview.connect("cursor-changed", self.cursor_changed)
cell = Gtk.CellRendererText()
cell.set_property('editable', True)
cell.connect('edited', self.cell_edited,0)
self.tvcolumn = Gtk.TreeViewColumn('0', cell, text=0, weight=2)
self.treeview.append_column(self.tvcolumn)
cell = Gtk.CellRendererCombo()
cell.set_property('editable', True)
cell.set_property('has-entry', False)
cell.set_property('text-column', 1)
cell.set_property('model', choices)
cell.connect('edited', self.cell_edited,1)
self.tvcolumn = Gtk.TreeViewColumn('1', cell, text=1, weight=3)
self.treeview.append_column(self.tvcolumn)
self.window.add(self.treeview)
self.window.show_all()
GObject.timeout_add_seconds(1, self.check_sigint)
def main():
Gtk.main()
if __name__ == "__main__":
example = TreeViewExample()
main()
С учетом вышеизложенного, при перемещении курсора вокруг изменяется вес шрифта, но если вы попытайтесь отредактировать ячейку, операция редактирования не может быть завершена (функции выпадающего списка не исчезают). Однако, если вы прокомментируете соединение сигнала с измененным курсором в строке 108, редактирование будет завершено. Итак, еще раз, как я могу иметь оба? Это ошибка?