2017-08-01 12 views
5

Niedawno przestudiowałem wzorce projektowe gtk i odnalazłem in-app notifications. Jest opis, kiedy go używać, ale nie ma odniesienia do interfejsu API gtk.gtk Powiadomienia w aplikacji Interfejs API

Szukałem go, ale znalazłem tylko GNotification i GApplication.send_notification, ale to wysyła powiadomienie do środowiska graficznego.

Czy ktoś może pomóc w znalezieniu samouczka lub przykładowy kod do robienia powiadomienia w aplikacji?

+0

chciałbym wykorzystać ten sam :) I dlatego pozwoliłem sobie zgłosić żadnego odniesienia API do linku na dole strony. – theGtknerd

+0

Wysyłam już dzisiaj pocztę, może to nie potrwa zbyt długo :) – microo8

+0

microo8 @theGtknerd sprawdź odpowiedź. –

Odpowiedz

5

"Widżet aplikacji" to połączenie widżetów, klasy css i zachowań.

Powinieneś użyć Gtk.Overlay w oknie, które zamierzasz użyć powiadomień aplikacji, a następnie użyj Gtk.Frame z predefiniowaną klasą app-notification. Gtk.Frame powinno być opakowane w Gtk.Revealer, aby umożliwić przejście "slide".

Oto plik polana ui (app-notification.ui) na przykładzie:

<?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> 
    <property name="default_width">440</property> 
    <property name="default_height">250</property> 
    <child> 
     <object class="GtkOverlay" id="overlay1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkBox" id="box1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="orientation">vertical</property> 
      <child> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">APP-NOTIFICATION EXAMPLE</property> 
       </object> 
       <packing> 
       <property name="expand">True</property> 
       <property name="fill">True</property> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkButton" id="button1"> 
       <property name="label" translatable="yes">show app-notification</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> 
      </object> 
      <packing> 
      <property name="index">-1</property> 
      </packing> 
     </child> 
     <child type="overlay"> 
      <object class="GtkOverlay" id="overlay2"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="valign">start</property> 
      <child> 
       <object class="GtkRevealer" id="revealer2"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="halign">center</property> 
       <child> 
        <object class="GtkFrame" id="frame2"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <property name="label_xalign">0</property> 
        <property name="shadow_type">none</property> 
        <child> 
         <object class="GtkBox" id="box2"> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="spacing">20</property> 
         <child> 
          <object class="GtkLabel" id="label2"> 
          <property name="visible">True</property> 
          <property name="can_focus">False</property> 
          <property name="label" translatable="yes">This is an app-notification. Click the button to dismiss</property> 
          </object> 
          <packing> 
          <property name="expand">False</property> 
          <property name="fill">True</property> 
          <property name="position">0</property> 
          </packing> 
         </child> 
         <child> 
          <object class="GtkButton" id="button2"> 
          <property name="visible">True</property> 
          <property name="can_focus">True</property> 
          <property name="receives_default">True</property> 
          <property name="relief">none</property> 
          <child> 
           <object class="GtkImage" id="image2"> 
           <property name="visible">True</property> 
           <property name="can_focus">False</property> 
           <property name="icon_name">window-close-symbolic</property> 
           </object> 
          </child> 
          <style> 
           <class name="image-button"/> 
          </style> 
          </object> 
          <packing> 
          <property name="expand">False</property> 
          <property name="fill">True</property> 
          <property name="position">1</property> 
          </packing> 
         </child> 
         </object> 
        </child> 
        <child type="label_item"> 
         <placeholder/> 
        </child> 
        <style> 
         <class name="app-notification"/> 
        </style> 
        </object> 
       </child> 
       </object> 
       <packing> 
       <property name="pass_through">True</property> 
       <property name="index">-1</property> 
       </packing> 
      </child> 
      </object> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Wynik w Polanie:

enter image description here

I tu jest jakiś kod, który używa python poprzedni plik polany i nadaje dynamiczne zachowanie powiadomieniu, aby można było zobaczyć je w akcji, klikając przyciski. Plik polana powinny być nazwane app-notification.ui, w przeciwnym razie należy zmienić kod w celu odzwierciedlenia Imię:

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

def onButtonShow(self): 
    revealer.set_reveal_child(True) 

def onButtonClose(self): 
    revealer.set_reveal_child(False) 

builder = Gtk.Builder() 
builder.add_from_file("app-notification.ui") 

window = builder.get_object("window1") 

buttonShow = builder.get_object("button1") 
buttonClose = builder.get_object ("button2") 
revealer = builder.get_object("revealer2") 

buttonShow.connect ("clicked", onButtonShow) 
buttonClose.connect ("clicked", onButtonClose) 
window.connect ("destroy", Gtk.main_quit) 
window.show_all() 

Gtk.main() 
+1

Z ciekawości, gdzie znalazłeś tę informację? – theGtknerd

+0

@theGtknerd powiedzieć prawdę, nie pamiętam dokładnie, gdzie dokładnie, ale chciałem uchwycić pliki css, aby wyszukać nazwy klas. Coś jak zbiorcza wyszukiwarka, Get A, z A do B ... potem do C. Dobrym podejściem jest zapamiętanie jakiejś aplikacji, która używa czegoś, co chcesz, a następnie przejście do źródeł na github lub gnome git i spróbuj znaleźć jak oni to zaimplementowali. W każdym razie oboje mieliście rację. Nie ma dokumentacji, jak to osiągnąć. może powinniśmy dodać coś takiego do Gnome/HowDoI –