Очистить очередь уведомлений для 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. К сожалению, ничего особенного не произойдет, если вы захотите перевести переключатель с ВКЛ на ВЫКЛ, даже если вы попытаетесь сделать это без предварительного ввода текста.
В коде есть некоторые функции-заглушки и переменные. Это всего лишь некоторый тестовый код, поэтому на самом деле не имеет значения, насколько он чист, я позабочусь об этом, когда попытаюсь включить этот код в финальную программу