473,372 Members | 924 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,372 software developers and data experts.

TKinter Destroy Question

Rob
My first GUI so be gentle...

When I start my program I call a class that runs the initial window. While
in this class if a certain button is pressed it calls a function outside the
class. This function then initially calls another function to
"root.destroy()". Basically I want the current window gone so the function I
just called can open it's own window. The problem I'm stuck with is that
once this function is done and I need to close the new window to go to the
next window i again call the function which performs the "root.destroy()".
When I try to call it a second time it tells me:

TclError: can't invoke "destroy" command: application has been destroyed

How can it already be destroyed if I opened a new window in my function?
Should I slip in somewhere a new "root.mainloop()" statment? It seems when I
try this I get some weird results (Every command after the new
root.mainloop() nothing happens, no buttons drawn, nothing). Is there an
easier way to clear windows than to use the root.destroy? I've basically run
into a nice brick wall...

Thanks for the help!
Rob
Jul 18 '05 #1
2 26165
Rob wrote:
My first GUI so be gentle...

When I start my program I call a class that runs the initial window. While
in this class if a certain button is pressed it calls a function outside the
class. This function then initially calls another function to
"root.destroy()". Basically I want the current window gone so the function I
just called can open it's own window. The problem I'm stuck with is that
once this function is done and I need to close the new window to go to the
next window i again call the function which performs the "root.destroy()".
When I try to call it a second time it tells me:

TclError: can't invoke "destroy" command: application has been destroyed

How can it already be destroyed if I opened a new window in my function?
Should I slip in somewhere a new "root.mainloop()" statment? It seems when I
try this I get some weird results (Every command after the new
root.mainloop() nothing happens, no buttons drawn, nothing). Is there an
easier way to clear windows than to use the root.destroy? I've basically run
into a nice brick wall...


Destroying the root window in a Tkinter application actually means destroying
the whole application, not only the root window. The root window is the main
window for the application; it is the first to pop up and must be the last to
go. If I understand correctly, your application does not have an actual main
window: if a second window is opened from the initial window, closing the
initial window should not quit the application. Am I right?

If I am, the way to do that with Tkinter (or tcl/tk) is to create a fake root
window and hide it. This window will only be used to quit the application when
the last window is closed:

----------------------------------------------------------
from Tkinter import *

## Create main window
root = Tk()
## Hide it
root.withdraw()

## List of windows currently opened
windows = []

## Function to create a new window
def newWindow():
## Create window
wdw = Toplevel()
## Button in window to create another new window
Button(wdw, text='New window', command=newWindow).pack()
## Remember window in list of opened ones
windows.append(wdw)
## When the user asks to close the window, call function closeWindow on it
wdw.protocol('WM_DELETE_WINDOW', lambda wdw=wdw: closeWindow(wdw))

## Function called when a window's close button is clicked
def closeWindow(wdw):
## Actually close the window
wdw.destroy()
## Remove window from list of opened ones
if wdw in windows: windows.remove(wdw)
## If no more opened windows, quit application
if not windows: root.quit()

## Create first window in application
newWindow()

## Run appliction
root.mainloop()
----------------------------------------------------------

Run the script and create a few windows. You'll see that you can close any
window you want in any order: the application quits only when the last window is
closed.

HTH
--
- Eric Brunel <eric dot brunel at pragmadev dot com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com

Jul 18 '05 #2
On Thu, 2003-11-20 at 04:59, Rob wrote:
My first GUI so be gentle...

When I start my program I call a class that runs the initial window. While
in this class if a certain button is pressed it calls a function outside the
class. This function then initially calls another function to
"root.destroy()". Basically I want the current window gone so the function I
just called can open it's own window. The problem I'm stuck with is that
once this function is done and I need to close the new window to go to the
next window i again call the function which performs the "root.destroy()".
When I try to call it a second time it tells me:

TclError: can't invoke "destroy" command: application has been destroyed

When you destroy a window it's gone! so can't be destroyed again.....
Without an example of what you are doing it's difficult to help but.
You could call withdraw() method on root this will unmap it from the
screen (but not destroy it) However why are you calling destroy on root
twice? Perhaps you mean to call destroy on the old window when you
create a new one (like a Wizard)
e.g (untested...)

root=Tk()

def createNext():
nextWindow = Toplevel()
nextWindow.title("Next Window")
b = Button(root, text="Create Next Window", command=createNext)
b.pack()
root.withdraw()
root.title("The Main Root Window")
b = Button(root, text="Create Next Window", command=createNext)
b.pack()
root.mainloop()
The problem here is you are not getting rid of the previous window when
the Next button is pressed just root!
Perhaps a better example would be:-
class MyApplication(Tk):
def __init__(self):
Tk.__init__(self)
self.title("Main Application Window")
self.prevWindow = self
self.windowCount = 1
b = Button(self, text="Next", command=self.nextWindow)
b.pack()

def nextWindow(self):
window = Toplevel()
self.windowCount = self.windowCount + 1
window.title("Next Window %d" %self.windowCount)
b = Button(window, text="Next", command=self.nextWindow)
b.pack()
self.prevWindow.withdraw()
self.prevWindow = window


app = MyApplication()
app.mainloop()
However this will never finish! to close the whole application the
app.quit() method must be called..... or if it's inside the class
definition self.quit()

Basically explain what you want with some example code and we can help

Regards
Martin
--
Martin Franklin <mf********@gatwick.westerngeco.slb.com>
Jul 18 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Andrew Gregory | last post by:
Could someone help me out with these few lines of code: I would like to know why the Quit button in this application removes the buttons and causes "Quitting" to be printed, but does not close the...
3
by: Mickel Grönroos | last post by:
Hi everybody, I'm using QuickTimeTcl (3.1) to be able to play movie files in my Tkinter application (Python 2.3.2) on Windows 2000. I was planning to write a simple wrapper class,...
6
by: max(01)* | last post by:
hi people. when i create a widget, such as a toplevel window, and then i destroy it, how can i test that it has been destroyed? the problem is that even after it has been destroyed, the instance...
5
by: max(01)* | last post by:
hello. i wrote a very simple tkinter demo program that uses menus, buttons, labels, entries, frames and secondary toplevels. it is a python version of a java program made by a colleague. ...
0
by: Stewart Midwinter | last post by:
I have a Tkinter app running on cygwin. It includes a Test menu item that does nothing more than fetch a directory listing and display it in a Toplevel window (I'd use a tkMessageBox showinfo...
1
by: Michael Yanowitz | last post by:
Hello: Below I have included a stripped down version of the GUI I am working on. It contains 2 dialog boxes - one main and one settings. It has the following problems, probably all related, that...
3
by: joshdw4 | last post by:
I hate to do this, but I've thoroughly exhausted google search. Yes, it's that pesky root window and I have tried withdraw to no avail. I'm assuming this is because of the methods I'm using. I...
3
by: J-Burns | last post by:
Hello. Im a bit new to using Tkinter and im not a real pro in programming itself... :P. Need some help here. Problem 1: How do I make something appear on 2 separate windows using Tkinter? By...
0
by: nicstel | last post by:
Hello. My script run fine within python but not in my program(SDS/2 wich is a software like Autocad). The problem is I got an error when the time comes to read the line14 to 19. (Source code come...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.