Problem with tkinter mainloop
k2riddim
k2riddim at gmail.com
Tue Nov 30 09:30:50 EST 2004
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 <eric_brunel at despammed.com> wrote in message news:<41ac53ac$0$30438$8fcfb975 at news.wanadoo.fr>...
> 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
More information about the Python-list
mailing list