[Python] Tkinter

Daniele Varrazzo piro a develer.com
Ven 11 Apr 2008 17:51:11 CEST


<afa8af2d014a59245265ef85ebb4163f a develer.com> <77d767450804110721m4a403ac5y844fcc4cabae5765 a mail.gmail.com>
Message-ID: <2a7ba476323ca7afb16c129f827aa26a a develer.com>
X-Sender: piro a develer.com
Received: from 82.111.147.97 [82.111.147.97] with HTTP/1.1 (POST); Fri, 11 Apr
	2008 17:51:11 +0200
User-Agent: RoundCube Webmail/0.1
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit


On Fri, 11 Apr 2008 16:21:16 +0200, "Mauro Maccari"
<mauro.maccari a gmail.com> wrote:
> ciao Daniele
> penso che la soluzione piĆ¹ facile sia richiamare il loop degli eventi
> visto che la funzione
> dura poco.

Non puoi "richiamare" il loop degli eventi: quello gira da se', e *deve*
girare, altrimenti tutto freezza.

Se hai una funzione long running, quello che puoi fare e' di quando in
quando lanciare un process_events() (nome inventato, ma qualcosa omologa 
c'e' in tutti i framework UI che conosco, immagino sia anche in tkinter).

la tua funzione non dura poco, perche'

         while self.run:
             print "On"

dura potenzialmente per sempre: ovvero finche' il checkbox e' flaggato.
(tra l'altro vale sempre true perche' "self.run" e' un oggetto, non un
numero o un bool: devi fare "self.run.get()"). E' il singolo 'print "On"' a
durare poco, ed e' solo questo da far chiamare periodicamente dal
framework. 

Lo snippet seguente funziona come ti aspetti. Non uso "idle" ma uso un
timer che chiama periodicamente la funzione se il flag e' checkato. Nota
che il trigger scatta una sola volta, quindi per ottenere la periodicita'
occorre registrarlo nuovamente ogni volta che scatta (finestra.after)

    from Tkinter import *
    class Application(Frame):
    
        def __init__(self, master):
    
            frame = Frame()
            frame.pack(padx = 50, pady = 20)
    
            self.run = IntVar()
            self.running=Checkbutton(frame, text="ON/OFF", fg="red",
                 variable=self.run, command=self.report)
            self.running.grid(row=0 , column=0)
    
        def report(self):
            if self.run.get():
                print "On"
                finestra.after(200, func=app.report)
    
    finestra = Tk()
    app = Application(finestra)
    finestra.mainloop()

Ref. http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com



Maggiori informazioni sulla lista Python