简体   繁体   中英

Some questions about switches in python

This is my first Question here at StackOverflow, so please be patient with me if some info isn't present or I missed something important, but anyways i'll do my best :)

Recently I started to code in Python2.7, so I'm not very good at it. While playing with PyGtk, PyGObject, Glade, etc I found something particular about switches (Haven't tried with any other widget, so I don't know if it happens somewhere else. Most likely it doesn't, I hope...)

I made a very basic GUI with a single "window" plus a "switch" using Glade

My objective was to deactivate switch after user tried to activate it if some exeption raised up before, something like:

  • Activate it --> * Found error --> * Deactivate it

I made some code, and after a while, I noted that THIS piece of code created a loop-like block, blocking GUI's window afterwards:

builder = Gtk.Builder()
window1 = builder.get_object('window')
switchie = builder.get_object('switchie')

switchie.set_active(False)

def Hi(switch, active):
    print switchie.get_active()
    switchie.set_active(not switchie.get_active())


switchie.connect("""notify::active""", Hi)

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

If i'm right, "switchie.connect" links "switchie" object with "Hi" func whenever "switchie" gets clicked.

But if I execute this and try to turn switch on, GUI hangs up. I did try to execute this via script & command-line and adding the "print switch state", resulting in an endless loop (True & False)

I tried with many other funcs I made, but neither of them could solve this issue. In fact, this is the "essence" of all the other funcs I made.

Why does this happen?

Where's the loop?

Am I wrong in some line?

Help is appreciated!

(If you need to see the rest of my faulty funcs, just ask for 'em, but I don't think they'll help...)

You want to hook up the switch like this:

switchie.connect("""activate""", Hi)

This will only get called once for every time it is clicked. What you were doing is hooking up to the signal after it changed, so it was constantly changing, and never catching up. You will also want to change

def Hi(switch, active):

to

def Hi(switch, active = None):

for keyboard support.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM