title: How to properly show and hide GTK window in python
body: <p>So I have the following code (python 2.7) that checks for a combination of keypresses and shows/hides a gtk window with a few gtk entry boxes. The show/hide works until the window locks up and stops responding, and the inner part of the window turns black. I have to kill the process and start it up again once that window turns black. I've tried all different combinations of show_all() and returning True after hiding the window to no avail. I'm not sure what I'm doing wrong here.<a href="https://i.stack.imgur.com/VXrWE.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/VXrWE.png" alt="enter image description here"></a></p>
  
  <p>In the end I'd like to be able to press this key combination and show/hide this window without the contents going away.</p>
  
  <pre><code>#!/usr/bin/python
  
  import gi
  gi.require_version('Gtk', '3.0')
  from gi.repository import Gtk
  import pyxhook
  
  class MyWindow(Gtk.Window):
  
      def __init__(self):
      Gtk.Window.__init__(self, title="Configurator")
  
      self.box = Gtk.Box(spacing=6)
      self.add(self.box)
  
      self.ipEntry = Gtk.Entry()
      self.ipEntry.set_text("IP Address")
  
      self.maskEntry = Gtk.Entry()
      self.maskEntry.set_text("NetMask")
  
      self.gatewayEntry = Gtk.Entry()
      self.gatewayEntry.set_text("gatewayEntry")
  
      self.button1 = Gtk.Button(label="Save")
      self.button1.connect("clicked", self.on_button1_clicked)
      self.box.pack_start(self.ipEntry, True, True, 0)
      self.box.pack_start(self.maskEntry, True, True, 0)
      self.box.pack_start(self.gatewayEntry, True, True, 0)
      self.box.pack_start(self.button1, True, True, 0)
  
      #catch window destroy event and stop it from happening
      self.connect('delete-event', self.on_destroy)
  
      def on_button1_clicked(self, widget):
      print("Hello")
      def on_destroy(self, widget=None, *data):
      print("tried to destroy")
      self.hide()
      return True
  
  #list of ascii keypresses to test if a certain combination of keys is pressed
  keypresses = []
  
  win = MyWindow()
  win.connect("delete-event", Gtk.main_quit)
  win.show_all()
  win.set_keep_above(True)
  
  def OnKeyboardEvent(event):
  #ascii 227 is l_control, ascii 225 is l_shift, ascii 120 is x
  #bring the following external variables into the scope of this function
      global keypresses
      global win
  #check if gtk window is hidden or visible
      isVisible = win.get_property("visible")
  
      #store our keypress if it is worthy of being stored (we started with a control character)
      if event.Ascii == 227 or ( len(keypresses) &gt;= 1 and keypresses[0] == 227 ):
              print("here" + str(len(keypresses)))
              keypresses.append(event.Ascii)
      #check if we have three items in keypresses to compare, then see if it's the right combination
      if len(keypresses) == 3 and keypresses[0] == 227 and keypresses[1] == 225 and keypresses[2] == 120:
          #show/hide our window
              if isVisible:
              win.hide()
              del keypresses[:]
              keypresses = []
          else:
              win.show_all()
              #clear out our list to compare again
              del keypresses[:]
              keypresses = []
      elif len(keypresses) &gt;= 3:
              del keypresses[:]
              keypresses = []
  
  #create instance of hook manager
  HookManager = pyxhook.HookManager()
  #define our callback to fire when a key is pressed
  HookManager.KeyDown = OnKeyboardEvent
  #hook the keyboard
  HookManager.HookKeyboard()
  #start our listener
  HookManager.start()
  
  Gtk.main()
  #close the hook listener when gtk main loop exits
  HookManager.cancel()
  </code></pre>