[Tkinter-discuss] Issues converting TKinter application to Ttk

Fleming, Land D. (JSC-ER111)[Jacobs Technology, Inc.] land.d.fleming at nasa.gov
Thu Jan 2 21:59:44 CET 2014


I have a Tkinter application that runs as intended, but I'm in the process of converting it to Ttk in order to get some of the new widget classes Ttk provides. I'm using Python 2.7.5 on a Windows 7 machine. I've run into two serious problems doing the conversion that I've been able to find work-arounds for, but I'm not sure if the problems are associated with undocumented peculiarities with Ttk or if I'm doing something wrong. I describe the application and the two problems below. I've worked with Tkinter for several months but only recently tried to using Ttk. If anyone knows of a repository where issues like these are documented, please let me know.

Thanks

The application frame is a subclass of PanedWindow defined as follows:

      import sys, os
      from Tkinter import *
      import ttk
      from ttk import *

      class App(ttk.PanedWindow):
        ...
        def __init__(self, master, **panedWindowOpts):
                        PanedWindow.__init__(self, master, **panedWindowOpts)

First problem:

I found that the styles I defined for widgets in the application were ignored when I made the application's master an instance of Tk() as follows:

      root = Tk()
      app = App(root, style='My.TPanedwindow', orient=VERTICAL)

After considerable trial and error (mostly error) I found that the styles worked as advertised, if I changed the application master to an instance of Toplevel rather than of Tk:

      top = Toplevel()
      app = App(top, style='My.TPanedwindow', orient=VERTICAL)
top.mainloop()


Second Problem:

When the mainloop executed as above, what appeared to be an extraneous blank window was stacked on top of the application window. This window didn't appear when I was using basic Tkinter.  I noticed that if I killed the extraneous window by clicking on the "X" in the window's upper right corner, it also killed the application, which suggested the "extraneous" window was really the root window. After searching the documentation and much trial and error, I found that I could get the root window to go away without killing my app by explicitly calling withdraw() on the root before running the mainloop:

      Tkinter._default_root.withdraw()
      app.mainloop()

This would have been a show stopper if I hadn't been able to work around it, because I couldn't give an application to end users that pops up a meaningless empty window that they have to close themselves.  I wasn't able to locate much documentation on the root window, and I only found out about _default_root by looking at Tkinter.py. Further, I found nothing to indicate that the root had a withdraw method, and just tried it after running out of all other options I could think of. Luckily, it worked.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tkinter-discuss/attachments/20140102/827124f2/attachment.html>


More information about the Tkinter-discuss mailing list