2016-11-18 22 views
2

我想要一個具有永久可見搜索欄的小應用程序。 Gtk.SearchEntry的當前實現是當您按Esc時,搜索欄從窗口中消失。通過添加on_key_release-事件處理程序,我在下面的MWA中工作,但是當我按下Esc時,它會嘮叨我,搜索欄會閃爍一會兒然後重新出現。你不停地Esc在按下它實際上將留只要不可見的。Gtk3 Python - 永久可見搜索欄

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gdk 


class AppWindow(Gtk.ApplicationWindow): 
    def __init__(self): 
     super(AppWindow, self).__init__() 
     self.grid = Gtk.Grid() 
     self.add(self.grid) 
     self.searchbar = Gtk.SearchBar() 
     self.grid.attach(self.searchbar, 1, 1, 1, 1) 
     if not self.searchbar.get_search_mode(): 
      self.searchbar.set_search_mode(True) 

     self.searchentry = Gtk.SearchEntry() 
     self.searchbar.connect_entry(self.searchentry) 
     self.searchbar.add(self.searchentry) 
     self.searchbar.set_show_close_button(False) 
     self.connect("key-release-event", self._on_key_release) 

    def _on_key_release(self, widget, event): 
     keyname = Gdk.keyval_name(event.keyval) 
     if keyname == 'Escape': 
      self.searchbar.set_visible(True) 
      self.searchbar.set_search_mode(True) 
     if event.state and Gdk.ModifierType.CONTROL_MASK: 
      if keyname == 'f': 
       self.searchbar.set_search_mode(True) 


class Application(Gtk.Application): 
    def __init__(self): 
     super(Application, self).__init__() 

    def do_activate(self): 
     self.win = AppWindow() 
     self.win.show() 
     self.win.connect("delete-event", Gtk.main_quit) 
     self.win.show_all() 

     Gtk.main() 

if __name__ == '__main__': 
    app = Application() 
    app.run() 

是否有可能,而不是把整個搜索欄眨眼,我只看到了當前的搜索文本消失,沒有任何閃爍?

回答

4

如果您想讓搜索條目始終可見,請停止使用SearchBar。只需將SearchEntry直接添加到您的容器。

class AppWindow(Gtk.ApplicationWindow): 
    def __init__(self): 
     super(AppWindow, self).__init__() 
     self.grid = Gtk.Grid() 
     self.add(self.grid) 

     self.searchentry = Gtk.SearchEntry() 
     self.grid.attach(self.searchentry, 1, 1, 1, 1) 
     self.connect("key-release-event", self._on_key_release)} 

您可能需要設置一些邊距或間距以獲得適合您的外觀。

+2

完美的作品! – oschoudhury