* Dodo, on 05.06.2010 15:46:
Hi,

let's consider this exemple :

from tkinter import *
from tkinter.ttk import *

class First:
def __init__(self):
self.root = Tk()
B = Button(self.root, command=self.op)
B.pack()

self.root.mainloop()

def op(self):
Second(self)
print("print")


class Second:
def __init__(self, parent):
root = Toplevel(parent.root)
root.grab_set()

root.mainloop()


First()



when I close the second window, the print is NOT executed. It's done
when I close the first window.
Why do it "freeze" my function?

First, sorry about Thunderbird 3.x messing up the quoting of the code.

Don't know what they did to introduce all those bugs, but anyway, Thunderbird 3.x is an example that even seasoned programmers introduce an unbelievable number of bugs, I think mostly just by repeating code patterns blindly.

In your code above you're doing as the TB programmers presumably did, repeating a code pattern that you've seen has worked, without fully grokking it. The call to 'mainloop' enters a loop. A button press causes your callback to be invoked from within that loop, but your code then enters a new 'mainloop'.

Don't.

Except for modal dialogs the single top level 'mainloop' suffices (all it does is to dispatch "messages" to "handlers", such as your button press callback). So, just place a single call to 'mainloop' at the end of your program. Remove the calls in 'First' and 'Second'.


Cheers & hth.,

- Alf


--
blog at <url: http://alfps.wordpress.com>
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to