tkFileDialog closes main application

mdmdmd mt_nich at yahoo.com
Thu Dec 21 20:53:22 EST 2006


Thanks for the reply.

I used your modified code to test.  I ran the code on Windows Python 2.4 
tcl/tk 8.4.  When I opened the ui I:
1) click browse button
2) file dialog opens and I double click the file.  When I do this, the 
selected file path is entered in Entry field. I don't need to close 
dialog, it closes automatically.
3) click browse button again
4) double click file
5) repeat

sometimes it only takes one time to kill root, sometimes a few more. 
After I killed root with the double clicks I then tried with a click 
browse - select file - click open button very slowly making sure I 
didn't double click and the same thing happened - root was destroyed.

BTW, with your modified code, the "Closed by the WM" was not displayed 
to console.

Hmmm?  I think this must just be peculiar to Windows.  Can any other 
windows users test to see if they can reproduce?

thanks again for your response.

Eric Brunel wrote:
> On Wed, 20 Dec 2006 18:37:10 +0100, mdmdmd <mt_nich at yahoo.com> wrote:
> 
>> Hello,
>>
>> I wish to collect 4 files from a user.  So I have decided to use  
>> tkFileDialog askopenfilename.  My problem is that after a few file  
>> selections the root window is destroyed (the whole program just  
>> dissappears)
> 
> 
> I tested the code below on Linux with Python 2.1 and tcl/tk 8.3.4 and 
> it  works perfectly.
> 
>> I have created a simple example and was able to reproduce the same 
>> thing  with this.  I've just started using tkinter so I have no idea 
>> what I may  be doing wrong.  If anyone has any ideas please let me know.
>>
>> If you run the following code, just click the Browse button, and 
>> select  a file.  Do this repeatedly and for me after the sixth or 
>> seventh time  the window shuts down.
> 
> 
> Is there any error when this happens? Have you tried running your 
> script  from a DOS command window?
> 
>> BTW, I'm using python 2.4 on Windows XP.  Thank you for any help.
> 
> 
> How do you select your files? I occasionally see problems on Windows 
> when  a window is closed via a double-click: the last 'button release' 
> event for  the double-click is not consumed by the dialog, but sent to 
> the window  behind it. Could it be what happens? If you select your 
> files with a  double-click and if the mouse cursor just happens to be on 
> the close  button for your main window behind it, you may involuntarily 
> close the  main window when selecting the file. Please try to select the 
> files and  then press the 'Open' button to see if the problem still 
> happens.
> 
> Here is a tiny modification to your code to print a message when the  
> window is closed via its close button:
> 
>> ################################################################################ 
>>
>>
>> from Tkinter import *
>> import Pmw
>> import tkFileDialog
>> import os.path
>>
>> filepath = 'C:\\Documents and Settings\\admin\\Desktop\\'
>>
>> class App(Frame):
>>      def __init__(self,master):
>>          Frame.__init__(self, master, bg='gray')
>>          self.enttxt = StringVar()
>>
>>          lbl = Label(self,text='File 1:')
>>          lbl.grid(row = 0,column = 0,sticky = W,padx = 5,pady = 5)
>>
>>          self.e1 = Entry(self,textvariable = self.enttxt,width = 50)
>>          self.e1.grid(row = 0,column = 1,columnspan = 3,sticky = 
>> W,padx  = 5,pady = 5)
>>
>>          btn = Button(self,text='Browse ...',width = 12,
>>                       command = self.browse)
>>          btn.grid(row = 0,column = 4,sticky=W,padx=5,pady=5)
> 
> 
>            master.protocol('WM_DELETE_WINDOW', self.doQuit)
> 
>        def doQuit(self):
>            print 'Closed by the WM!'
>            self.quit()
> 
>>
>>      def browse(self):
>>          fileformats = [('Text File ','*.csv'),
>>                         ('All Files ','*.*')]
>>
>>          retval = tkFileDialog.askopenfilename(title='Choose File',
>>                                                initialdir=filepath,
>>                                                filetypes=fileformats,
>>                                                parent = self)
>>          if retval:
>>              self.enttxt.set(os.path.abspath(retval))
>>
>> def main():
>>      root = Tk()
>>      root.withdraw()
>>      root.title('test')
>>      root.configure(bg='gray')
>>      app = App(root)
>>      app.pack()
>>      root.update()
>>      root.deiconify()
>>
>>      root.mainloop()
>>
>>
>> if __name__ == '__main__':
>>      main()
> 
> 
> BTW, why do you create a sub-class of Frame for your application? Why 
> not  create a sub-class of Tk instead?
> 
> HTH



More information about the Python-list mailing list