2017-08-04 2 views
1

Ich habe einen Expander, der, anstatt ein Etikett zu verwenden, eine Box mit Tasten und Etiketten in der Art einer Symbolleiste hat. Das Problem ist, dass der Expander aktiviert wird, wenn ich mit diesen Widgets interagiere.gtk Expander mit komplexen Expander-Widgets

Grundsätzlich möchte ich den Expander nur funktionieren, wenn ich tatsächlich auf den Pfeil klicke, nicht auf den Pfeil links vom Pfeil ... oder, vielleicht sogar bevorzugt, nicht auf die Buttons oder andere anklickbare Flächen.

Es scheint, dass der Expander die Klickereignisse über die Tasten abfängt, anstatt sie durch die Tasten fallen zu lassen (nicht sicher, ob sie auch reagieren).

Dies könnte wahrscheinlich im Quellcode behoben werden, indem das Verhalten der Klickereignisse geändert und einige Maustreffer getestet werden. Ich bin mir nicht ganz sicher, wie ich das jetzt machen soll, da ich neu bei GTK bin, aber ich hoffe, dass es einen einfacheren Weg gibt.

Grund Expander

> label 
... 

Mein Expander

> label button 
... 

Klicken auf die Schaltfläche macht das gleiche wie auf dem Etikett klicken oder>, die ich nicht will. Ich möchte, dass die Schaltfläche als Schaltfläche fungiert und nicht dazu führt, dass sich der Expander in irgendeiner Weise ausdehnt.

Antwort

1

Ich habe Ihren Ansatz versucht und wenn Sie das Signal an die Schaltfläche anschließen, erhalten Sie nicht das Verhalten, nach dem Sie suchen.

Um das zu bekommen, müssen Sie das Signal an den Expander anschließen, sagen wir, mit dem button-press-event und True zurückgeben, um die Ausbreitung des Signals zu vermeiden.

Dadurch können Sie vermeiden, den Expander zu erweitern und schließlich die Situation zu steuern, wenn es erweitert wird.

Glade-Datei (expand.ui):

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.20.0 --> 
<interface> 
    <requires lib="gtk+" version="3.20"/> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkBox"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkExpander" id="expander1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <child> 
       <object class="GtkBox"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="orientation">vertical</property> 
       <child> 
        <object class="GtkButton"> 
        <property name="label" translatable="yes">Action 1</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">True</property> 
        <property name="position">0</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton"> 
        <property name="label" translatable="yes">Action 2</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">True</property> 
        <property name="position">1</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton"> 
        <property name="label" translatable="yes">Action 3</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">True</property> 
        <property name="position">2</property> 
        </packing> 
       </child> 
       </object> 
      </child> 
      <child type="label"> 
       <object class="GtkButton" id="menub"> 
       <property name="label" translatable="yes">Menu</property> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="receives_default">True</property> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkImage"> 
      <property name="width_request">400</property> 
      <property name="height_request">300</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="stock">gtk-missing-image</property> 
      </object> 
      <packing> 
      <property name="expand">True</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Python-Code für einige Logik:

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

def onMenuButtonPress(self, widget): 
    #uncomment below to recreate the original behavior 
    #expander.set_expanded(not expander.get_expanded()) 
    return True 

builder = Gtk.Builder() 
builder.add_from_file("expander.ui") 

window = builder.get_object("window1") 
menu = builder.get_object("menub") 
expander = builder.get_object("expander1") 

expander.connect("button-press-event", onMenuButtonPress) 

window.connect ("destroy", Gtk.main_quit) 
window.show_all() 

Gtk.main() 

Wenn Sie den Code ausführen, werden Sie feststellen, dass Taste drückt sehen das nicht erweitern Expander. Tastendrücke werden jedoch ausgeführt (benötigt, um wichtige Presseereignisse zu behandeln usw.)

Entfernen Sie die angezeigte Zeile im Code, um das Eigenverhalten wiederherzustellen.

+0

Danke, ich dachte, es würde so etwas erfordern. Habe es nicht getestet, aber das scheint der richtige Weg zu sein. Ich habe mich deswegen vom Expander wegbewegt, da es wirklich nichts mehr bietet, außer der Erweiterung, die ich sowieso aus anderen visuellen Gründen handhaben muss (ich möchte automatisch einen Vertrag abschließen, wenn die App nicht benutzt wird, also es wird abhängig von einem Timer "deexpandieren". Danke noch einmal! – AbstractDissonance

+0

nur, um eine bedingte Rückgabe mit 'True' und' False' Werten zu wiederholen, würde das gleiche Verhalten haben. Vielen Dank. Viel Glück. –