Как создать апплет Budgie, показывая меню?

Я изменил свой etc / fstab так, чтобы он смонтировал сетевой ресурс следующим образом:

//WDMyCloud/Story_1_5Tb_2 /home/plex/story cifs _netdev,guest,uid=plex,gid=mediaserver,rw,iocharset=utf8,file_mode=0770,dir_mode=0770 0 0

В частности, я добавил следующие строки в строку:

,iocharset=utf8,file_mode=0770,dir_mode=0770,
3] Это дало полные права на чтение, запись и выполнение сетевого ресурса членам группы «uid = mediaserver». «Uid = plex» уже имел такое разрешение даже до модификаций; Я решил не предоставлять разрешение на «o» всех пользователей.

Теперь, если я ls -l папку, в которую я установил мою СТРОЙ, я получаю:

drwxrwx--- 2 plex mediaserver 0 Mar 3 09:53 story

Следовательно,

Теперь, когда я вижу, что делают эти параметры («абсолютные» значения идентичны chmod, что делает все это довольно понятно), я не понимаю, почему то, что я делал раньше (установка uid и gid), было недостаточно / правильно, и я не понимаю, почему выполнение chmod с привилегиями sudo не помогло бы решить эту проблему. На самом деле сходство этой опции с chmode делает ее похожей на какой-то chmod, выполненный на mount, поэтому почему chmod, выполненный позже, не решает?

1
задан 19 March 2018 в 18:30

3 ответа

Основной пример

Ваш код кажется слишком сложным во многих отношениях. Несколько очевидных вещей:

Вы можете просто использовать Gtk.Menu, вы не создаете меню с помощью ряда кнопок. Не используйте кнопку переключения для вызова апплета, нормальная кнопка - это то, что вам нужно. Если вы используете EventBox, вам совсем не нужна кнопка. Достаточно импортировать subprocess только один раз во главе апплета

. Короче говоря, пример

Возможно, было бы лучше показать пример того, как это может быть

#!/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()
        )

И файл .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

Другие советы

При создании меню вы можете добавьте элементы меню в список в сочетании с командами, которые вы хотите запустить. Таким образом, вам не нужно использовать отдельные функции для каждой команды, но просто запустите команду в качестве аргумента для запуска run_command(). 13]

1
ответ дан 22 May 2018 в 12:29
  • 1
    Здравствуй. Спасибо за ответ. Что-то еще. Как изменить размер и длину меню? – cgiannakisis 20 March 2018 в 01:02
  • 2
    @cgiannakisis в Gtk.Menu, ширина определяется шириной текста. Однако, по сравнению с индикатором Unity, апплет чрезвычайно гибкий, и вы можете показать ему все, что вы можете показать в Gtk.Window, используя popover – Jacob Vlijm 20 March 2018 в 02:09

Основной пример

Ваш код кажется слишком сложным во многих отношениях. Несколько очевидных вещей:

Вы можете просто использовать Gtk.Menu, вы не создаете меню с помощью ряда кнопок. Не используйте кнопку переключения для вызова апплета, нормальная кнопка - это то, что вам нужно. Если вы используете EventBox, вам совсем не нужна кнопка. Достаточно импортировать subprocess только один раз во главе апплета

. Короче говоря, пример

Возможно, было бы лучше показать пример того, как это может быть

#!/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() )

И файл .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

Другие советы

При создании меню вы можете добавьте элементы меню в список в сочетании с командами, которые вы хотите запустить. Таким образом, вам не нужно использовать отдельные функции для каждой команды, но просто запустите команду в качестве аргумента для запуска run_command().

1
ответ дан 17 July 2018 в 18:31

Основной пример

Ваш код кажется слишком сложным во многих отношениях. Несколько очевидных вещей:

Вы можете просто использовать Gtk.Menu, вы не создаете меню с помощью ряда кнопок. Не используйте кнопку переключения для вызова апплета, нормальная кнопка - это то, что вам нужно. Если вы используете EventBox, вам совсем не нужна кнопка. Достаточно импортировать subprocess только один раз во главе апплета

. Короче говоря, пример

Возможно, было бы лучше показать пример того, как это может быть

#!/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() )

И файл .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

Другие советы

При создании меню вы можете добавьте элементы меню в список в сочетании с командами, которые вы хотите запустить. Таким образом, вам не нужно использовать отдельные функции для каждой команды, но просто запустите команду в качестве аргумента для запуска run_command().

1
ответ дан 23 July 2018 в 19:19

Другие вопросы по тегам:

Похожие вопросы: