Текст GTK ToolButton перестает отображаться после 10 минут бездействия компьютера, в апплете Python gtk mate

По какой-то причине следующий код работает нормально, но если компьютер не используется в течение примерно 10 минут (без взаимодействия с мышью / клавиатурой), текст ToolButton перестает отображаться на панели и остается пустым. Странная вещь, если с помощью ПК он будет работать дольше, есть идеи, почему или что может привести к такому отказу?

Подумайте, возможно, мой следующий шаг - установить новую виртуальную машину Linux для тестирования кода и исключить мою установку из-за того, что у меня закончились идеи.

также будет предпринята другая попытка заставить код запускаться с терминала вместо команд "добавить на панель" или "mate-panel-test-applets", относящихся к рабочему столу mate, так как я уверен, что есть другие ошибки / предупреждения, которые не выводятся через операторы print из-за того, что панель панели.

# Пример выходного текста апплета панели: "/ = 6G"

Я использую: 
Linux katerina 4.15.0-36-generiC#39-Ubuntu SMP Пн 24 сентября 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Ubuntu 18.04.1 LTS
GTK 3.22.30
python sys.version = '3.6.6 (по умолчанию, 12 сентября 2018, 18:26:19) \n[GCC 8.0.1 20180414 (экспериментальный) [ствол ревизии 259383]]
  • Знайте элементы управления, работающие как могут получить события щелчка
  • Проверенная заставка, Опции управления питанием
  • Пробовал форсировать события перерисовки на ToolButton
  • проверил ToolButton lable.text обновление еще
  • Проверил мой свободный код диска все еще работает, так что знаю, работает планировщик
  • проверено изменение текста дискового пространства dd if=/dev/zero of=test bs=1024 count=1000000
  • Пробная настройка box.set_above_child(False)

    импорт системы
    ведение журнала импорта
    импортировать logging.handlers
    импорт ОС
    импорт шутил
    импорт ги
    
    gi.require_version('MatePanelApplet', '4.0')
    gi.require_version("Gtk", "3.0")
    
    из gi.repository import Gtk
    из gi.repository import Gdk
    из gi.repository import MatePanelApplet
    с даты и времени импорт
    из apscheduler.schedulers.background import BackgroundScheduler
    из размера спешите. размер импорта
    def configure_logger():
        # Создайте новый регистратор и подключитесь к системному журналу, так как он запускается как скрипт
        my_logger = logging.getLogger("TestPythonApplet")
        my_logger.setLevel(logging.DEBUG)
        logging.getLogger('apscheduler').setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(имя)s[%(процесс)d]: %(имя уровня)s: %(сообщение)s')
        handler = logging.handlers.SysLogHandler(address = '/dev/log')          
        handler.setFormatter(форматировщик)
        my_logger.addHandler(обработчик)
        вернуть my_logger
<pre>

# create the applet. Basicly all your applet code for buttons, etc here
def applet_fill(applet):
    #todo: maybe create a applet class like dock_applet.py example
    my_logger.debug('Applet started')

    #NOTE: Click events not always registered when click using ToolButton
    #Think because it dont own its own X-window for preformance reasons as mostly decrotive
    #As such dont normaly have to handle x events
    #see: https://developer.gnome.org/gtkmm-tutorial/3.0/chapter-widgets-without-xwindows.html.en
    #So we wrap in an Gtk.EventBox()
    button = Gtk.ToolButton()

    box = Gtk.EventBox()    #Used to capture mouse events
    box.set_above_child(True)   #Fixes left clicks not being detected 100%

    box.add(button)
    box.connect("button_press_event", button_click, applet)
    applet.add(box)

    #    show_image = False



#    if show_image:
#        #Follow works for showing image 
#        theme = Gtk.IconTheme().get_default()
#        if theme.has_icon("mate"):      #Keep things simple and look for known icon installed
#            my_logger.debug('Mate icon found')
#
#            image = Gtk.Image()
#            #<class 'gi.repository.GdkPixbuf.Pixbuf
#            i = theme.load_icon("happy", 32, Gtk.IconLookupFlags.NO_SVG)     
#            s= image.new_from_pixbuf(i)    #<class 'gi.repository.Gtk.Image'> 
#            button.set_icon_widget(s)
#    else:   #Use text mode
#        button.set_label(get_disk_free())

<pre>
    button.set_label(get_disk_free())
    #Now finnished creating applet start disk
    scheduler.start()
    scheduler.add_job(set_disk_free, 'interval', args=[applet],  seconds=1, id='set_disk_free_id', replace_existing=True)    #Args to pass to function set_disk_free
    applet.show_all()
    return True
</pre>
        def set_disk_free (applet):
        #TODO: есть ли способ использовать функцию типа applet.get_child_by_name("GtkToolButton")
        # Найти виджет toolButton и установить текст    
        для элементов в applet.get_children():     # Получить список дочерних объектов в апплете 
            #my_logger.debug(items.get_name())   # должен быть 'gi.repository.Gtk.EventBox'
            if items.get_name() == "GtkEventBox":
                для предметов в items.get_children():
                    if items.get_name() == "GtkToolButton": # Найти основную кнопку инструмента
                        items.set_label(get_disk_free())  
                        items.queue_draw()  #lets по какой-то причине пытаются перерисовать виджет
                                            # если не трогать ПК в течение 10 минут не вижу текст в панели
                                            #yet строка отладки ниже показывает, что текст все еще установлен и обновляется
                        my_logger.debug ('Метка: \"' + items.get_label() + '\"')
def get_disk_free():
    usage_string = '/ = '+ size(shutil.disk_usage('/').free)
    my_logger.debug('Updateing:' +  str(datetime.now().strftime('%d-%m-%Y %H:%M:%S')) + usage_string )
    return usage_string

def button_click(widget, event, applet):
    if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 1:
        my_logger.debug('Left Button clicked')
        my_logger.debug('Updating free space text')
        set_disk_free(applet)

    if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
        my_logger.debug('Right Button clicked')


def applet_factory(applet, iid, data):
# return False to tell mate we did not create a applet

    if iid != "TestPythonApplet":
       return False
    applet_fill(applet)
    return True

#Code starts here
my_logger = configure_logger()    
scheduler = BackgroundScheduler()

MatePanelApplet.Applet.factory_main("TestPythonAppletFactory", True,
                                    MatePanelApplet.Applet.__gtype__,
                                    applet_factory, None)
my_logger.debug('Exiting')
scheduler.shutdown()



<pre>
#
#To test:
##########
##Create File: org.mate.panel.applet.TestPythonApplet.service
#[D-BUS Service]
#Name=org.mate.panel.applet.TestPythonAppletFactory
#Exec=/usr/bin/env python3 /home/chiptoxic/Downloads/mate-panel-applet/test_python_applet/test_python_applet.py
#
##Create File: org.mate.panel.TestPythonApplet.mate-panel-applet
#[Applet Factory]
#Id=TestPythonAppletFactory
#InProcess=false
#Location=/home/chiptoxic/Downloads/mate-panel-applet/test_python_applet/test_python_applet.py
#Name=Test Applet Factory
#Description=A MATE Python Applet example factory
# 
#[TestPythonApplet]
#Name=Test Python Applet
#Description=A MATE Python Applet example
#Icon=happy
#MateComponentId=OAFIID:MATE_TestPythonApplet

#Simplified path to save space
#sudo ln -s org.mate.panel.TestPythonApplet.mate-panel-applet /usr/share/mate-panel/applets/org.mate.panel.TestPythonApplet.mate-panel-applet
#sudo ln -s org.mate.panel.applet.TestPythonApplet.service /usr/share/dbus-1/services/org.mate.panel.applet.TestPythonApplet.service
#chmod 755 org.mate.panel.TestPythonApplet.mate-panel-applet
#chmod 644 org.mate.panel.TestPythonApplet.service
#tail -f /var/log/syslog
# 
#Following will kill process id of applet (have as bash script binded to key for easy testing / reload
#kill $(ps -aux | grep python3 | grep test_python_applet.py | tr -s ' ' | cut -d ' ' -f 2)
#
################################################################################ 
</pre>

0 ответов

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