Many thanks, You're right this wasn't my code, this was just what I can remember, because my application is at home, and I'm at work. Be sure I'll follow your advices concerning posting rules in this group !
Eric Brunel <[EMAIL PROTECTED]> wrote in message news:<[EMAIL PROTECTED]>... > k2riddim wrote: > > Hello, > > I'm a beginner with Python and Tkinter development. > > My application parse links in an html file. And I use Tkinter to > > implement a GUI. This GUI has a button to launch the parse treatment, > > and a status bar to show the state of the treatment. > > I know that because of the mainloop, my tkinter application freeze > > while my treatment isn't finished. That's why my status bar doesn't > > update herself in real time. > > I wanted to use the after or the after_idle function, but I don't > > really understand why it doesn't work. > > after and after_idle won't help you: the action you register in these methods > are called only when the main loop gets back the control, and your problem is > precisely that the main loop does not get it... > > The method you're probably looking for is update_idletasks: it updates the > display without getting any user event. There's another method called update, > but this one does process user events, so it may call some of your code if > such > an event is pending. This is usually not what you want to do, except in some > very rare cases. > > Here is how it may look like in your code, along with a few remarks on your > code: > > > > > My apps is build approximately like that : > > > > ---Gui.py--- > > class Gui(Frame): > > Why do you inherit from Frame? A Tkinter Frame is a generic container widget; > this is not a window. IMHO, you'd better inherit from Tk for your main window > or > from Toplevel for other windows. You'd also get better control on the actual > window, since some of the methods available on Tk and Toplevel are not > available > on other widgets (e.g. geometry or protocol) > > > def __init__(self): > > ... > > def launchTreatment(self): > > b = Treatment() > > self.after(b.treatment.parse) > > This cannot be your code; the after methods takes two parameters: the number > of > milliseconds to wait before the action will be called and the action itself. > You > only provide the action here. But again, the after method won't help you to > get > what you want... > > > > > ---Treatment.py--- > > class Treatment(): > > def __init__(self): > > ... > > def parse(self): > > ... > > GUIinstance.status.set("state 1") > > This is where the GUIinstance.update_idletasks() should go. > > > ... > > GUIinstance.status.set("state 2") > > Another GUIinstance.update_idletasks() here. > > > > > > > ---Main.py--- > > #instanciation of classes > > GUIinstance = Gui > > Again, this cannot be your code, since you do not instantiate the class here. > The correct line should be: > > GUIinstance = Gui() > > It is usually far better to post a working example demonstrating the problem > you > have instead of just extracting a few lines of your whole code. This will > help > people who are willing to help to understand exactly what is going on. > > HTH -- http://mail.python.org/mailman/listinfo/python-list