Como criar um applet Budgie, mostrando um menu?

1

Abaixo está o código de um applet budgie em python, que eu criei. O applet está sendo executado sem problemas.

#!/usr/bin/env python3

import gi.repository
gi.require_version('Budgie', '1.0')
from gi.repository import Budgie, GObject, Gtk, Gdk

class myapplet(GObject.GObject, Budgie.Plugin):

   __gtype_name__ = "myapplet"

def __int__(self):

    GObject.Object.__init__(self)

def do_get_panel_widget(self, uuid):

    return myappletApplet(uuid)

class myappletApplet(Budgie.Applet):

    button = None
    manager = None

def __init__(self, uuid):

    Budgie.Applet.__init__(self)

    #create a toggle button in panel
    self.button = Gtk.ToggleButton.new()
    self.button.set_relief(Gtk.ReliefStyle.NONE)
    self.button.set_active(False)
    self.button.set_tooltip_text("Apple Menu")
    box1 = Gtk.EventBox()
    box1.add(self.button)
    self.add(box1)

    img = Gtk.Image.new_from_icon_name("apple", Gtk.IconSize.BUTTON)
    self.button.add(img)
    box1.show_all()
    self.show_all()

    #create a popover
    self.popover = Budgie.Popover.new(self.button)


    #create a box
    box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
    self.popover.add(box)

    #create separators
    separator1 = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
    box.pack_start(separator1, True, True, 0)

    separator2 = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
    box.pack_start(separator2, True, True, 0)

    separator3 = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
    box.pack_start(separator3, True, True, 0)

    separator4 = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
    box.pack_start(separator4, True, True, 0)

    separator5 = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
    box.pack_start(separator5, True, True, 0)

    #events
    def event_press(box2, event_press):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["hardinfo"])

    def event_press1(box3, event_press1):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["gnome-control-center"])

    def event_press2(box4, event_press2):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["gnome-software"])

    def event_press3(box5, event_press3):
        if self.pop.get_visible():
            self.pop.hide()
        else:
            self.pop.show_all()

    def event_press4(box6, event_press4):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.run("xkill")

    def event_press5(box7, event_press5):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["systemctl", "suspend"])

    def event_press6(box8, event_press6):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["gnome-session-quit", "--reboot"])

    def event_press7(box9, event_press7):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["gnome-session-quit", "--power-off"])

    def event_press8(box10, event_press8):
        self.popover.hide()
        self.button.set_active(False)
        import subprocess
        subprocess.call(["gnome-session-quit"])


    #create popover items
    box2 = Gtk.EventBox()
    label1 = Gtk.Label("About This Pc")
    label1.set_size_request(250, 30)
    label1.set_xalign(0.1)
    #label1.set_use_markup(True)
    box2.connect("button-press-event", event_press)
    box2.add(label1)
    box.pack_start(box2, True, True, 0)
    box.reorder_child(box2, 0)

    box3 = Gtk.EventBox()
    label2 = Gtk.Label("System Settings...")
    label2.set_size_request(250, 25)
    label2.set_xalign(0.12)
    #label2.set_use_markup(True)
    box3.connect("button-press-event", event_press1)
    box3.add(label2)
    box.pack_start(box3, True, True, 0)
    box.reorder_child(box3, 2)

    box4 = Gtk.EventBox()
    label3 = Gtk.Label("Software...")
    label3.set_size_request(250, 25)
    label3.set_xalign(0.09)
    label3.set_justify(Gtk.Justification.LEFT)
    box4.connect("button-press-event", event_press2)
    box4.add(label3)
    box.pack_start(box4, True, True, 0)
    box.reorder_child(box4, 3)

    box5 = Gtk.EventBox()
    label4 = Gtk.Label("Recent Items")
    label4.set_size_request(250, 30)
    label4.set_xalign(0.1)
    box5.connect("button-press-event", event_press3)
    box5.add(label4)
    box.pack_start(box5, True, True, 0)
    box.reorder_child(box5, 5)

    self.pop = Budgie.Popover.new(box5)
    self.pop.set_position(Gtk.PositionType.RIGHT)
    boxy = Gtk.Box()
    boxy = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
    boxy.set_size_request(250, 400)
    self.pop.add(boxy)
    recentchooserwidget = Gtk.RecentChooserWidget()
    boxy.add(recentchooserwidget)

    box6 = Gtk.EventBox()
    label5 = Gtk.Label("Force Quit")
    label5.set_size_request(250, 30)
    label5.set_xalign(0.09)
    box6.connect("button-press-event", event_press4)
    box6.add(label5)
    box.pack_start(box6, True, True, 0)
    box.reorder_child(box6, 7)

    box7 = Gtk.EventBox()
    label6 = Gtk.Label("Sleep")
    label6.set_size_request(250, 20)
    label6.set_xalign(0.08)
    box7.connect("button-press-event", event_press5)
    box7.add(label6)
    box.pack_start(box7, True, True, 0)
    box.reorder_child(box7, 9)

    box8 = Gtk.EventBox()
    label7 = Gtk.Label("Restart")
    label7.set_size_request(250, 20)
    label7.set_xalign(0.08)
    box8.connect("button-press-event", event_press6)
    box8.add(label7)
    box.pack_start(box8, True, True, 0)
    box.reorder_child(box8, 10)

    box9 = Gtk.EventBox()
    label8 = Gtk.Label("ShutDown")
    label8.set_size_request(250, 20)
    label8.set_xalign(0.09)
    box9.connect("button-press-event", event_press7)
    box9.add(label8)
    box.pack_start(box9, True, True, 0)
    box.reorder_child(box9, 11)

    box10 = Gtk.EventBox()
    label9 = Gtk.Label("LogOut\t\t\tCtrAltDel")
    label9.set_size_request(250, 30)
    label9.set_xalign(0.23)
    box10.connect("button-press-event", event_press8)
    box10.add(label9)
    box.pack_start(box10, True, True, 0)

    #button signal
    self.button.connect("toggled", self.on_button_toggled, self.popover)


def on_button_toggled(self, button, popover):

    if self.button.get_active():

        self.popover.show_all()


    else:

        self.popover.hide()
        self.pop.hide()

Este applet abre um menu pop-over com itens que podem ser selecionados e executam cada um deles em um comando separado. O menu popover abre e fecha pressionando um botão de alternância. Eu usei o construtor Budgie.popover.new () para isso.Existem alguns problemas que eu quero refinar.

Primeira edição.  Eu quero o popover para fechar automaticamente quando eu clico em algum lugar fora do popover .Como posso conseguir isso.Agora eu tenho que empurrar novamente o botão de alternância.

Segunda questão.  Quando eu seleciono, digamos que o primeiro item no popover ("Sobre este Pc" item), o botão congela na posição empurrada e eu não posso ativá-lo (o botão do Google) novamente.Eu tenho que fechar primeiro o aplicativo que abriu e depois pressione novamente o botão de alternância. Isso acontece para os itens "Sobre este PC", "Configurações do sistema", "Reiniciar" e "Desligar". Estranhamente isso não acontece para itens "Software", "Itens Recentes" e "LogOut".

Terceira questão. Quando eu seleciono o item "Itens Recentes", abre um novo popover com itens recentes dentro, logo abaixo do eventbox (box5) .O que eu quero é abrir este novo popover (self.pop) à direita do eventbox.

Qualquer ajuda será apreciada.

Obrigado antecipadamente.

    
por cgiannakisis 19.03.2018 / 12:08

1 resposta

1

Um exemplo básico

Seucódigopareceserexcessivamentecomplexodeváriasmaneiras.Algumascoisasóbvias:

  • VocêpodesimplesmenteusarumGtk.Menu,vocênãocriaummenuporumasériedebotões.
  • Nãouseumbotãodealternânciaparachamarumapplet,umbotãonormaléoquevocêprecisa.SevocêusaumEventBox,nãoprecisadeumbotão.
  • Ésuficienteimportarsubprocessapenasumavez,nacabeçadoapplet

Emsuma,umexemplo

Podesermelhorapenasmostrarumexemplodecomoissopodeserfeito.

#!/usr/bin/env python3 import subprocess import gi.repository gi.require_version('Budgie', '1.0') from gi.repository import Budgie, GObject, Gtk class SomeApp(GObject.GObject, Budgie.Plugin): __gtype_name__ = "SomeApp" def __int__(self): GObject.Object.__init__(self) def do_get_panel_widget(self, uuid): return SomeAppApplet(uuid) class SomeAppApplet(Budgie.Applet): manager = None def __init__(self, uuid): Budgie.Applet.__init__(self) self.box = Gtk.EventBox() self.add(self.box) img = Gtk.Image.new_from_icon_name("firefox", Gtk.IconSize.MENU) self.box.add(img) self.menu = Gtk.Menu() self.create_menu() self.box.show_all() self.show_all() def run_command(self, menuitem): print(menuitem) subprocess.Popen(["gedit"]) def create_menu(self): item1 = Gtk.MenuItem('Some item') item1.connect("activate", self.run_command) item2 = Gtk.MenuItem('Another item') item3 = Gtk.MenuItem('I am on a roll, yet another item') for item in [item1, item2, item3]: self.menu.append(item) self.menu.show_all() self.box.connect("button-press-event", self.popup_menu) def popup_menu(self, *args): self.menu.popup( None, None, None, None, 0, Gtk.get_current_event_time() )

E o arquivo .plugin ( SomeApp.plugin :

[Plugin]
Loader=python3
Module=someapp
Name=Some App
Description=Obviously an App
Authors=James Bond
Copyright=Copyright © 2018 007
Website=some_website
Icon=firefox

Outras dicas

Na criação do menu, você pode adicionar os itens de menu a uma lista, combinada com os comandos que deseja executar. Dessa forma, você não precisa usar funções separadas para cada comando, mas apenas execute o comando como argumento para executar run_command() .

    
por Jacob Vlijm 19.03.2018 / 14:59