2011-03-07 11 views
6

मैं gtk.Entry विजेट gtk.TreeViewColumn शीर्षलेख/शीर्षक के भीतर फोकस करने योग्य या संपादन योग्य कैसे बना सकता हूं? मैंने यह कोशिश की है:TreeViewColumn शीर्षलेख में PyGTK प्रविष्टि विजेट

# Create tree-view. 
treeview = gtk.TreeView() 

#... 

# Create column. 
renderer = gtk.CellRendererText() 
column = gtk.TreeViewColumn(None, renderer, text=0) 

# Set column header. 
header = gtk.VBox() 

title = gtk.Label("Column") 
header.pack_start(title) 

filter = gtk.Entry() 
#... 
header.pack_start(filter) 

header.show_all() 
column.set_widget(header) 

# Add column 
treeview.append_column(column) 

लेकिन कॉलम हेडर में एंट्री विजेट संपादन योग्य नहीं है और फोकस नहीं करेगा। मैंने True और False दोनों को 'क्लिक करने योग्य' सेटिंग करने का प्रयास किया है। मैं उबंटू 10.04 पर pygtk 2.21.0-0ubuntu1 और libgtk 2.22.0-0ubuntu1 का उपयोग कर रहा हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा।

संपादित करें:

मुद्दा है कि कैसे एक GtkTreeViewColumn हेडर प्रदर्शित किया जाता है की वजह से उपजी। हेडर विजेट GtkAlignment के अंदर रखा गया है जिसका माता-पिता GtkHBox है जिसका माता-पिता GtkButton है जिसका माता-पिता अंततः GtkTreeView है। GtkButton ध्यान केंद्रित करने और माउस इनपुट प्राप्त करने से GtkEntry को रोक रहा है और रोक रहा है।

उत्तर

11

आदेश में एक GtkTreeView हैडर मैं पड़ा भीतर एक GtkEntry फ़ोकस करने योग्य बनाने के लिए:

1) हैडर GtkButton का पता लगाएं।

def find_closest_ancestor(widget, ancestor_class): 
    if not isinstance(widget, gtk.Widget): 
     raise TypeError("%r is not a gtk.Widget" % widget) 
    ancestor = widget.get_parent() 
    while ancestor is not None: 
     if isinstance(ancestor, ancestor_class): 
      break; 
     ancestor = ancestor.get_parent() if hasattr(ancestor, 'get_parent') and callable(ancestor.get_parent) else None 
    return ancestor 

2) हैडर GtkButtonGtkEntry करने से button-press-event संकेत प्रचार।

def propagate_button_press_event(parent, event, *data): 
    parent_alloc = parent.get_allocation() 
    x = parent_alloc.x + int(event.x) 
    y = parent_alloc.y + int(event.y) 
    children = parent.get_children() 
    print "Propagating event:%r" % event 
    print "- from parent:%r" % parent 
    while children: 
     for child in children: 
      child_alloc = child.get_allocation() 
      if child_alloc.x <= x <= child_alloc.x + child_alloc.width and child_alloc.y <= y <= child_alloc.y + child_alloc.height: 
       print "- to child:%r" % child 
       if child.get_property('can-focus'): 
        event.send_event = True 
        child.grab_focus() 
        child.emit('button-press-event', event, *data) 
        return True 
       else: 
        children = child.get_children() if hasattr(child, 'get_children') and callable(child.get_children) else None 
        break; 
     else: 
      children = None 
    return False 

3) हैडर GtkButtonGtkEntry करने से ध्यान केंद्रित है (यानी, focus-in-event संकेत) प्रचार।

def propagate_focus_in_event(parent, event, *data): 
    print 'focus-in', parent, event 
    child = parent.get_child() 
    if child.get_property('can-focus'): 
     child.grab_focus() 
    else: 
     if not child.child_focus(gtk.DIR_TAB_FORWARD): 
      parent.get_toplevel().child_focus(gtk.DIR_TAB_FORWARD) 
    return True 

उदाहरण:

# Fix style glitches 
_gtk_styles = """ 
    # Use the default GtkEntry style for GtkEntry widgets in treeview headers. 
    widget "*.treeview-header-entry" style "entry" 
""" 
gtk.rc_parse_string(_gtk_styles) 

# Columns 
_columns = [ 
    (0, "Title"), 
    (1, "Description") 
    # etc. 
] 

# Create tree-view. 
items_view = gtk.TreeView(self.items_store) 
items_view.show() 

# Setup treeview columns. 
renderer = gtk.CellRendererText() 
for column in _columns: 
    column_index, column_title, column_filter = column 
    column_view = gtk.TreeViewColumn(None, renderer, text=column_index) 
    column_view.set_clickable(True) 

    column_widget = gtk.VBox() 
    column_widget.show() 

    column_align = gtk.Alignment(0, 0, 0, 0) 
    column_align.show() 
    column_widget.pack_start(column_align) 
    column_label = gtk.Label(column_title) 
    column_label.show() 
    column_align.add(column_label) 

    column_entry = gtk.Entry() 
    column_entry.set_name('treeview-header-entry') 
    column_entry.show() 
    column_widget.pack_start(column_entry) 

    column_view.set_widget(column_widget) 
    items_view.append_column(column_view) 

# Setup column headers. 
columns = items_view.get_columns() 
for column in columns: 
    column_widget = column.get_widget() 
    column_header = find_closest_ancestor(column_widget, gtk.Button) 
    if column_header: 
     column_header.connect('focus-in-event', propagate_focus_in_event) 
     column_header.connect('button-press-event', propagate_button_press_event) 
     column_header.set_focus_on_click(False) 
0

जब तक यह आपका उत्तर नहीं है, लेकिन मैं आपको मानक और सामान्य विधि का उपयोग करने का सुझाव देता हूं: treeview.set_search_column(COLUMN_INDEX) का उपयोग करके, डिफ़ॉल्ट रूप से कोई प्रविष्टि प्रदर्शित नहीं की जाएगी (और यूआई क्लीनर बनाता है) लेकिन जब उपयोगकर्ता टाइपिंग शुरू करता है (उस पर ध्यान केंद्रित करने के साथ) वृक्षदृश्य) एक पॉपअप इनपुट प्रविष्टि प्रदर्शित की जाएगी, और खोज और फ़िल्टरिंग जीटीके द्वारा स्वचालित रूप से किया जाएगा।

यदि आप जारी रखते हैं कि खोज प्रविष्टि हमेशा दिखाई देनी चाहिए, तो treeview.set_headers_visible(False) का उपयोग करके वृक्षदृश्य शीर्षलेख को हटाएं, और वृक्षदृश्य के ऊपर एक कस्टम HBox (लेबल और प्रविष्टि युक्त) जोड़ें।

+0

मैं एकाधिक स्तंभों पर खोज करने के लिए सक्षम होना चाहिए। साथ ही, मैं जीटीके की मानक खोज/फ़िल्टरिंग का उपयोग नहीं कर सकता क्योंकि डेटा डेटाबेस से प्राप्त एक सबसेट है और इसलिए जब फ़िल्टर सेट किया जाता है तो मैं फ़िल्टर के साथ डेटा के सबसेट को दोबारा पूछता हूं। – cpburnz

संबंधित मुद्दे