Очистить очередь уведомлений для Gtk.Switch

В последнее время я был здесь, задавая некоторые вопросы по этому поводу (перейдите в мой профиль, чтобы увидеть мои последние 2 вопроса)

Моя цель состояла в том, чтобы сделать Gtk.Switch, который автоматически деактивирует себя, если обнаружит исключение, пока пользователь пытается его активировать.

Мои последние две попытки были неудачными, что привело к бесконечному циклу при попытке закодировать функцию "авто-деактивации".

После некоторых исследований я нашел кое-что интересное в Уведомлениях.

Похоже, что Gtk "хранит" уведомления от объектов в очереди, когда вы "замораживаете" их с помощью object.freeze_notify()

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

Теперь мой вопрос здесь: есть ли какой-нибудь возможный способ "Очистить" очередь уведомлений Gtk.object?

РЕДАКТИРОВАТЬ:

Я хочу сделать это:

  • Пользователь запускает программу -> Пытается активировать Переключатель -> Программа обнаруживает исключение -> Не закрывать всю программу, просто снова деактивировать переключатель, как если бы пользователь его не трогал

Я хочу, чтобы это работало в обоих штатах (ON & OFF)

Если пользователь хочет выключить переключатель (он был включен), и программа обнаруживает исключение, снова включите переключатель автоматически, как будто ничего не произошло, и наоборот

Я использую Python2.7, Glade для разработки GUI, Gtk 3.4 и Ubuntu 14.04.5 в качестве моей ОС

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

import os
import subprocess
import sys
import subprocess
import signal
import time
from subprocess import call
import threading
from multiprocessing import Process
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GdkPixbuf

builder = Gtk.Builder()
#builder.add_from_file("""./Testing2.glade""")
builder.add_from_string("""

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.2"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="halign">baseline</property>
    <property name="valign">baseline</property>
    <property name="title" translatable="yes">Test</property>
    <property name="resizable">False</property>
    <property name="window_position">center</property>
    <property name="icon_name">applications-accessories</property>
    <property name="urgency_hint">True</property>
    <property name="has_resize_grip">False</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="halign">center</property>
        <property name="valign">center</property>
        <property name="margin_left">24</property>
        <property name="margin_right">24</property>
        <property name="margin_top">24</property>
        <property name="margin_bottom">24</property>
        <property name="orientation">vertical</property>
        <property name="spacing">16</property>
        <property name="homogeneous">True</property>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="primary_icon_name">applications-games</property>
            <property name="placeholder_text" translatable="yes">Texto</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkSwitch" id="switch1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="halign">center</property>
            <property name="valign">center</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>


""")

window1 = builder.get_object('window1')
textie = builder.get_object('entry1')
switchie =  builder.get_object('switch1')

def TurnOn(switch, active):

    print switchie.get_active()

    if yay == "":
        switchie.set_active(not switchie.get_active())

def TurnOff(switch, active):

    print switchie.get_active()

    if yay == "":
        switchie.set_active(not switchie.get_active())

def ParentTrue(switch,active):
    yay = textie.get_text().rstrip()
    if yay == "":
        def Hi():
            print switchie.get_active()
            switchie.handler_block(connecting)
            switchie.set_active(False)
            switchie.handler_unblock(connecting)
            return True
        Hi()

def ParentFalse(switch,active):
    yay = textie.get_text().rstrip()
    if yay == "":
        def Hi():
            print switchie.get_active()
            switchie.handler_block(connecting)
            switchie.set_active(True)
            switchie.handler_unblock(connecting)
            return True
        Hi()

switchie.set_active(True)

def qck():
    while True:
        os.environ["SomeVar"] = str(switchie.get_active())


p1 = threading.Thread(target=qck)

p1.start()

if not os.environ["SomeVar"]:
    connecting = switchie.connect('notify::active', ParentFalse)
if os.environ["SomeVar"]:
    connecting = switchie.connect('notify::active', ParentTrue)


window1.set_position(Gtk.WindowPosition.CENTER)
window1.connect("delete-event", Gtk.main_quit)
window1.show_all()

if __name__ == '__main__':
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    Gtk.main()

Этот код работает только от OFF до ON. Это не будет работать, когда вы переключаетесь с ON на OFF

Пример:

Если я выполню этот код и попытаюсь активировать переключатель БЕЗ ввода текста первым, он не изменится, НО, если вы введете текст (это не имеет значения, просто введите одну букву, если хотите), это позволит вам переместить переключиться с OFF на ON. К сожалению, ничего особенного не произойдет, если вы захотите перевести переключатель с ВКЛ на ВЫКЛ, даже если вы попытаетесь сделать это без предварительного ввода текста.

В коде есть некоторые функции-заглушки и переменные. Это всего лишь некоторый тестовый код, поэтому на самом деле не имеет значения, насколько он чист, я позабочусь об этом, когда попытаюсь включить этот код в финальную программу

0 ответов

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