On Wednesday, July 17, 2013 9:40:15 AM UTC+8, Dave Angel wrote:
> On 07/16/2013 08:57 PM, fronag...@gmail.com wrote:
> 
> > Hm. So I've written a GUI in tkinter. I've found two performance issues, I 
> > was hoping someone could point me in the right direction.
> 
> >
> 
> > Firstly, I'm using an image as a border, namely:
> 
> 
> 
>      <SNIP>
> 
> >
> 
> > This works, yes, but is annoyingly laggy on an older computer when I try to 
> > move the window around. I figure it's because the program has to keep 
> > redrawing the image border when dragged around, and is exacerbated by the 
> > fact that I have two of the imageborder frames in my application. How can I 
> > remedy this? I've tried using a hard-drawn image on a Canvas instead of the 
> > image border, but it's suboptimal because that prevents resizing the window.
> 
> >
> 
> 
> 
> This part I can't help with, as I'm not that familiar with tkinter in 
> 
> particular.  If I had to guess an approach, I'd tell you to create an 
> 
> object that represents the scaled border image, and then when it moves, 
> 
> you just reblit it.  And if/when the scale changes, you then recreate 
> 
> the object at the new scale.  Most of the time you won't be scaling.
> 
> 
> 
> But what that means in tkinter calls, I don't know and don't have time 
> 
> tonight to figure out.
> 
> 
> 
> >
> 
> > The other performance issue I've found is that when the logic is running, 
> > the app doesn't redraw. Ordinarily this would be acceptable, but as part of 
> > my program, it loads data from a website, and during the load, the window 
> > completely freezes up and doesn't respond until the download is done; as I 
> > understand it, tkinter doesn't redraw until it is forced to by .update() or 
> > control is given back to the mainloop. How can I force a more frequent 
> > redraw rate?
> 
> >
> 
> 
> 
> Tkinter, like every other GUI I know of, is event driven.  You're not 
> 
> intended to do "logic is running" kinds of events.  Break up larger 
> 
> problems into little tasks, and daisy chain them, returning to the event 
> 
> loop after each little piece.
> 
> 
> 
> A second approach that works with some GUI's is to fire up the event 
> 
> loop at periodic intervals in your long function;  get it to do a few 
> 
> other events and then return to you.  This isn't recommended usually 
> 
> because it can get very messy.  And it may not even be possible in tkinter.
> 
> 
> 
> Third approach is to start another thread to do the "logic is running." 
> 
>   Make sure that thread never calls any GUI stuff, but just updates 
> 
> values that can be seen by the main thread and its GUI stuff.  When 
> 
> you're done, post a message to the GUI to tell it to redraw whichever 
> 
> parts are now changed.
> 
> 
> 
> 
> 
> -- 
> 
> DaveA

Thanks for the responses.

Yeah, I understand that tkinter isn't really designed for 'logic is running' 
style issues, but I do need to load that data, and sometimes, that can take a 
while. I am in fact experimenting with threading another process to update the 
window, yes.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to