Python 2.7 清除Gtk.Switch的通知队列

Python 2.7 清除Gtk.Switch的通知队列,python-2.7,gtk,pygobject,Python 2.7,Gtk,Pygobject,最近我在这里问了一些与此相关的问题(转到我的个人资料查看我的最后两个问题) 我的目标是制作一个Gtk.Switch,当用户试图激活它时,如果它检测到一个exeption,它会自动停用 我的前两次尝试均未成功,在尝试编写“自动停用”功能代码时导致无限循环 经过一些研究,我发现了一些关于通知的有趣的东西 当您使用object.freeze\u notify() 既然我知道Gtk将通知事件存储到一个临时队列中,那么最好“清除”该queuue,这样我就可以避免由于尝试从事件处理程序内部停用开关而导致的无

最近我在这里问了一些与此相关的问题(转到我的个人资料查看我的最后两个问题)

我的目标是制作一个Gtk.Switch,当用户试图激活它时,如果它检测到一个exeption,它会自动停用

我的前两次尝试均未成功,在尝试编写“自动停用”功能代码时导致无限循环

经过一些研究,我发现了一些关于通知的有趣的东西

当您使用
object.freeze\u notify()

既然我知道Gtk将通知事件存储到一个临时队列中,那么最好“清除”该queuue,这样我就可以避免由于尝试从事件处理程序内部停用开关而导致的无限循环

现在,我的问题是:是否有任何可能的方法“清除”Gtk.object的通知队列? 编辑:

我想这样做:

  • 用户运行程序-->尝试激活开关-->程序检测到例外-->不要关闭整个程序,只需再次停用开关,就像用户并没有触摸它一样
我希望这在两种状态下都能工作(打开和关闭)

若用户想要关闭开关(它是打开的),并且程序检测到一个例外,那个么再次自动打开开关,就像什么都并没有发生一样&反之亦然

我使用Python2.7、Glade设计GUI、GTK3.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()
#/usr/bin/python2.7
#-*-编码:utf-8-*-
导入操作系统
导入子流程
导入系统
导入子流程
输入信号
导入时间
从子流程导入调用
导入线程
从多处理导入进程
导入gi
gi.require_版本('Gtk','3.0')
从gi.repository导入Gtk、GdkPixbuf
builder=Gtk.builder()
#builder.add_from_文件(“”/Testing2.glade“”)
生成器。从字符串(“”)中添加
假的
基线
基线
试验
假的
居中
应用附件
真的
假的
真的
假的
居中
居中
24
24
24
24
垂直的
16
真的
真的
真的
应用游戏
Texto
假的
真的
0
真的
真的
居中
居中
假的
真的
1.
""")
window1=builder.get\u对象('window1')
textie=builder.get\u对象('entry1')
switchie=builder.get\u对象('switch1')
def接通(开关,激活):
打印开关。使之处于活动状态()
如果yay==“”:
switchie.set\u active(非switchie.get\u active())
def关闭(开关,激活):
打印开关。使之处于活动状态()
如果yay==“”:
switchie.set\u active(非switchie.get\u active())
def ParentTrue(开关,激活):
yay=textie.get_text().rstrip()
如果yay==“”:
def Hi():
打印开关。使之处于活动状态()
开关处理器块(连接)
开关设置为激活状态(错误)
switchie.handler_解锁(连接)
返回真值
你好()
def ParentFalse(开关,激活):
yay=textie.get_text().rstrip()
如果yay==“”:
def Hi():
打印开关。使之处于活动状态()
开关处理器块(连接)
开关设置为激活(真)
switchie.handler_解锁(连接)
返回真值
你好()
开关设置为激活(真)
def qck():
尽管如此:
os.environ[“SomeVar”]=str(switchie.get_active())
p1=线程。线程(目标=qck)
p1.开始()
如果不是os.environ[“SomeVar”]:
connecting=switchie.connect('notify::active',ParentFalse)
如果os.environ[“SomeVar”]:
connecting=switchie.connect('notify::active',ParentTrue)
窗口1.设置窗口位置(Gtk.WindowPosition.CENTER)
window1.connect(“删除事件”,Gtk.main\u退出)
window1.show_all()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
输入信号
signal.signal(signal.SIGINT,signal.SIG_-DFL)
Gtk.main()
这段代码只是从头到尾工作。当你从开变关时,它就不起作用了

例如:

如果我执行此代码,并尝试在不首先输入文本的情况下激活开关,它不会改变,但如果您输入文本(没关系,只要输入一个字母,如果您愿意),它将允许您将开关从关闭移动到打开。不幸的是,如果您想将开关从ON切换到OFF,即使您不先输入文本也无法执行任何特殊操作


代码中有一些存根函数和变量。这只是一些测试代码,所以不管它有多干净,当我试图在最终程序中包含这些代码时,我会处理好它。

这听起来像是你的设计问题。notify本质上与属性值相关联:如果属性值已更改,则解冻后应该有一个notify——从概念上讲,它不是“对notify进行排队”,而是检查自冻结后属性值是否已更改。如果不希望接收通知,请确保属性值在解冻时为原始值,或者在解冻前断开信号处理程序。如果您想要一个实际的答案,您可能需要添加一个显示问题的代码示例。第三个选项是阻止特定连接,这需要保存
g\u signal\u connect()
的返回。无论如何都要显示你的代码,这样我们就可以找出是否有更好的方法来做你想做的事情。我会用代码更新我的问题,然后这听起来像是你这边的设计问题。notify本质上与属性值相关联:如果属性值已更改,则解冻后应该有一个notify——从概念上讲,它不是“对notify进行排队”,而是检查自冻结后属性值是否已更改。如果您不想收到通知,请确保