Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #50824

Re: tkinter redraw rates

Newsgroups comp.lang.python
Date 2013-07-17 21:38 -0700
References (7 earlier) <mailman.4801.1374061383.3114.python-list@python.org> <f564a889-99f0-4e9c-841f-830356743252@googlegroups.com> <mailman.4805.1374082807.3114.python-list@python.org> <78c6218b-2da8-41a0-9eb3-5432093b3f6b@googlegroups.com> <mailman.4818.1374109662.3114.python-list@python.org>
Message-ID <5dd8666d-abc1-41e7-9050-a9b95fbe1e16@googlegroups.com> (permalink)
Subject Re: tkinter redraw rates
From fronagzen@gmail.com

Show all headers | View raw


On Thursday, July 18, 2013 9:07:24 AM UTC+8, Dave Angel wrote:
> On 07/17/2013 08:44 PM, fronagzen@gmail.com wrote:
> > On Thursday, July 18, 2013 1:38:34 AM UTC+8, Dave Angel wrote:
> >> On 07/17/2013 09:18 AM, fronagzen@gmail.com wrote:
> >>> On Wednesday, July 17, 2013 7:42:45 PM UTC+8, Dave Angel wrote:
> >>>> On 07/17/2013 07:10 AM, fronagzen@gmail.com wrote:
> >>>>> On Wednesday, July 17, 2013 6:07:22 PM UTC+8, Dave Angel wrote:
> >>>>>> On 07/16/2013 11:04 PM, fronagzen@gmail.com wrote:
> >>>>>>> Noted on the quoting thing.
> >>>>>>> Regarding the threading, well, first, I'm not so much a programmer as someone who knows a bit of how to program.
> >>>>>>> And it seems that the only way to update a tkinter window is to use the .update() method, which is what I was experimenting with. Start up a new thread that just loops the .update() with a 1ms sleep until the download is done. It seems to work, actually.
> >>>>>> update() is to be used when it's too awkward to return to mainloop.  In
> >>>>>> my second approach, you would periodically call it inside the processing
> >>>>>> loop.  But unless tkinter is unique among GUI's, it's unsafe to do that
> >>>>>> in any thread besides the GUI thread.
> >>>>>> DaveA
> >>>>> Yes, based on advice from this thread, I'm doing that. From my main thread, I create a thread that handles the download while updating a variable that the mainloop displays as a text output, and in that mainloop, I have a while loop that updates the GUI until the downloading is done.
> >>>> I can't figure out what you're really doing, since each message from you
> >>>> says something different.  You don't need a separate while loop, since
> >>>> that's exactly what app.mainloop() is.
> >>>> --
> >>>> DaveA
> 
> >>> Hm. My apologies for not being very clear. What I'm doing is this:
> >>>           self.loader_thread = Thread(target=self.loadpages,
> >>>                                       name="loader_thread")
> >>>           self.loader_thread.start()
> >>>           while self.loader_thread.isAlive():
> >>>               self.root_window.update()
> >>>               sleep(0.05)
> >>> Where loadpages is a function defined elsewhere.
>
> >> Presumably this fragment is from a method of some class you've written.
> >>    Is it an event handler, or is this happening before you finish setting
> >> up the GUI?  Somewhere at top-level, you're supposed to fall into a call
> >> to mainloop(), which doesn't return till the user cancels the app.
> >> --
> >> DaveA
> 
> > This is, indeed, an event handler from a class for my GUI. My entire GUI is a bit large, so I'll not copy the entire thing here, but it roughly goes:
> > class GUI(object):
> >      def __init__(self):
> >          [stuff]
> >      def init_button(self):
> >          self.execute = ttk.Button(self.input_frame, text='Tally',
> >                                    command=self.execute_now)
> >          self.execute.grid(column=1, row=2, sticky=(N, S, E, W), columnspan=4)
> >      def execute_now(self):
> >          [stuff]
> >          self.loader_thread = Thread(target=self.loadpages,
> >                                      name="loader_thread")
> >          self.loader_thread.start()
>             self.root_window.after(100, self.test_thread)
>             return
> >          while self.loader_thread.isAlive():
> >              self.root_window.update()
> Nope - don't use that.  Instead, post an event on the queue, and return 
> to the mainloop() from whence we came.
>          def test_thread(self):
>             if self.loader_thread.isAlive():
>                 self.root_window.after(100, self.test_thread)
>                 return
>             [morestuff]
> >              sleep(0.05)
> >          [morestuff]
> > if __name__ == "__main__":
> >      APP = GUI()
> >      APP.root_window.mainloop()
> I probably don't have it quite right, but hopefully you'll get the idea. 
>   self.test_thread() is now a new event that will get repeatedly 
> invoked, to do the check on the thread status.  It returns rapidly 
> unless the condition has occurred.
> There are other things that should be done, like blocking the specific 
> events that would create duplicate threads.
> -- 
> 
> DaveA

I see, though it should be noted that your method doesn't actually block the rest of the even handler code from running, had to fiddle with it a bit to get that to work. May I ask what exactly is the rationale behind implementing it like this, though?

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

tkinter redraw rates fronagzen@gmail.com - 2013-07-16 17:57 -0700
  Re: tkinter redraw rates David Hutto <dwightdhutto@gmail.com> - 2013-07-16 21:32 -0400
  Re: tkinter redraw rates David Hutto <dwightdhutto@gmail.com> - 2013-07-16 21:34 -0400
  Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-16 21:40 -0400
    Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-16 18:51 -0700
      Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-16 22:21 -0400
        Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-16 20:04 -0700
          Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-17 06:07 -0400
            Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-17 04:08 -0700
              Re: tkinter redraw rates Michael Torrie <torriem@gmail.com> - 2013-07-17 16:53 -0600
            Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-17 04:10 -0700
              Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-17 07:42 -0400
                Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-17 06:18 -0700
                Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-17 13:38 -0400
                Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-17 17:44 -0700
                Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-17 21:07 -0400
                Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-17 21:38 -0700
                Re: tkinter redraw rates Dave Angel <davea@davea.name> - 2013-07-18 00:52 -0400
                Re: tkinter redraw rates Christian Gollwitzer <auriocus@gmx.de> - 2013-07-18 09:20 +0200
                Re: tkinter redraw rates fronagzen@gmail.com - 2013-07-18 02:10 -0700
                Re: tkinter redraw rates Peter Otten <__peter__@web.de> - 2013-07-17 20:10 +0200

csiph-web