2015-06-08 2 views
0

У меня есть gtk.Entry с иконкой после текста, намереваясь стать поиск текстового поля:Как создать выпадающий список из значка gtk.Entry?

gtk.Entry for search

То, что я пытаюсь сделать, это отобразить выпадающий список (т.е. gtk.ComboBox), когда пользователь нажимает на значок, чтобы выбрать тип поиска. Макет этой функции будет:

Mock of gtk.Entry with icon ComboBox

Я попробовал несколько вещей, без какого-либо успеха. Например, пытаясь упаковать пустой gtk.ComboBox, только показывая стрелку сразу после записи, и набивая ее только при нажатии значка, что создает иллюзию, но имеет два недостатка: а) когда я набиваю ComboBox, панель инструментов растет, и б) когда я очищаю() ListStore, ComboBox сохраняет свою ширину и оставляет уродливое серое окно.

На данный момент я предполагаю, что мне нужно создать CellRenderer на значке-прессе, который выталкивает значок Entry, и я пробовал без большого успеха понять код gtk.ComboBoxEntry (в gtkcomboboxentry.c) но, насколько я понял, он использует вертикальный контейнер по всему изделию вместе с CellRenderer.

Также у GTK + 3 нет никаких идей в этом отношении.

Любые идеи или некоторые рекомендации по созданию этого в PyGTK?

+1

Я не уверен, что вы имеете в виду с «GTK + 3 не имеет никаких идей на этот счет», но то, что вы описали можно сделать с Gtk.Popover (Gtk +> = 3.12). – elya5

ответ

1

Я искал что-то подобное, поэтому придумал код ниже. Я не очень беспокоился об эстетике. Я передал список кортежей в класс MyPopup с идеей передачи обработчиков для каждого из пунктов меню в раскрывающемся списке. Обратите внимание, что item.show() необходимо, даже если есть show_all():

from gi.repository import Gtk 

class MyPopup(Gtk.MenuButton): 
    def __init__(self, btndefs): 
     super(MyPopup, self).__init__() 

     self.menu = Gtk.Menu() 
     self.set_popup(self.menu) 
     #self.set_label(">") 
     self.set_direction(Gtk.ArrowType.RIGHT) 

     for btndef in btndefs: 
      item = Gtk.MenuItem() 
      item.set_label(btndef[0]) 
      item.show() 
      self.menu.append(item) 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.set_size_request(100, -1) 
     self.connect("destroy", lambda x: Gtk.main_quit()) 

     self.hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) 
     self.entry = Gtk.Entry() 

     self.popup = MyPopup((("String",), 
           ("String no case",), 
           ("Hexadecimal",), 
           ("Regexp",))) 

     self.hbox.pack_start(self.entry, True, True, 0) 
     self.hbox.pack_start(self.popup, False, True, 0) 

     self.add(self.hbox) 

     self.show_all() 

    def run(self): 
     Gtk.main() 


def main(): 
    mw = MainWindow() 
    mw.run() 
    return 0 

if __name__ == '__main__': 
    main() 

enter image description here

1

да его годом позже, но давайте не будем делать следующий человек споткнулся здесь, чтобы быть печальную, как я.

это пример использования Gtk.Menu()всплывающее окно, вы можете также похожие подвиг. с Gtk.Popover()

enter image description here

#!/usr/bin/env python3 

import gi 
gi.require_version('Gtk', '3.0') 

from gi.repository import Gtk, Gdk 

opts = { 
    'hex'  : "system-run-symbolic", 
    'regex' : "font-select-symbolic", 
    'string' : "font-x-generic-symbolic", 
    'no-case' : "tools-check-spelling-symbolic", 
} 

def make_menu(entry, opts): 
    menu = Gtk.Menu() 
    for label, icon in opts.items(): 
     item = Gtk.MenuItem() 
     item.set_label(label) 
     item.connect(
      "activate", 
      lambda w: entry.set_icon_from_icon_name(0, opts[w.get_label()]) 
     ) 
     menu.append(item) 

     # NOTE you can use Gtk.ImageMenuItem to add image but its 
     # Deprecated since version 3.10 

    menu.show_all() 
    return menu 


def on_icon_release(widget, pos, event): 
    menu = make_menu(widget, opts) 
    menu.popup(
     parent_menu_shell = None, 
     parent_menu_item = None, 
     func    = None, 
     data    = None, 
     button   = Gdk.BUTTON_PRIMARY, 
     activate_time  = event.get_time() 
    ) 

def make_entry(): 
    entry = Gtk.Entry() 
    entry.set_icon_from_icon_name(0, 'action-unavailable-symbolic') 
    entry.set_icon_from_icon_name(1, 'fonts') 
    entry.set_icon_sensitive(1, True) 
    entry.set_icon_activatable(1, True) 
    entry.connect("icon-release", on_icon_release) 
    return entry 


root = Gtk.Window() 
root.add(make_entry()) 
root.show_all() 
Gtk.main() 
Смежные вопросы