On 17/09/2013 12:32, Chris Angelico wrote:
[...]

If reloading and doing it again makes things different, what happens
if you simply trigger your code twice without reloading?

I've no idea if it'll help, it just seems like an attack vector on the
problem, so to speak.

Thanks for the suggestion, here's what I've found with some more testing. If I rewrite the function f() like this:

def f(fail):
    style = ttk.Style(_root)
    style.theme_create('newtheme', parent = 'default')
    tk.messagebox.showwarning('test', 'test')
    if fail:
        style.theme_use('newtheme')
        tk.messagebox.showwarning('test', 'test')


then I import the module and call f(False) followed by f(True), the second call raises an exception just like the original function. I've tried variations of the above, such as defining a module-level global style instead of having one created during the function call, and the end result is always the same. However, suppose instead I define two modules, tkderp and tkderp2; both have a function f as defined in my OP, but the first has the last two lines of f commented out, and the second doesn't (i.e. tkderp is the modified tkderp from before, and tkderp2 is the original). Then I do this:

>>> import tkderp
>>> tkderp.f()
>>> import tkderp2
>>> tkderp2.f()


In that case the second call to f() works fine - two warnings, no exception. In fact, if I replace tkderp with this:

# begin tkderp.py

import tkinter as tk

_root = tk.Tk()
_root.withdraw()

# end tkderp.py


then simply importing tkderp before tkderp2 is enough to make the latter work properly - this

>>> import tkderp2
>>> tkderp2.f()


raises an exception, but this

>>> import tkderp
>>> import tkderp2
>>> tkderp2.f()


doesn't. Any ideas what may be going on?
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to