[python-win32] (no subject)

Mike Driscoll mdriscoll at co.marshall.ia.us
Mon Apr 28 15:33:50 CEST 2008


Alex Denham wrote:
> Hi all,
>
> I'm just wondering but when i try to access/update anything on my 
> Tkinter GUI from one particular function, my whole program 
> crashes/freezes with no error.
>
> The function is part of a class which handles all the GUI 
> drawing/event handling etc.
> The function in question gets called from a win32 DesignatedWrapPolicy 
> class. Sample code below:
>
> [code]
>     # this function is part of an IDropTarget class, the TargetWidget 
> was definined in the __init__ method of this functoin and it points to 
> my class which handles the GUI.
>     def Drop(self, data_object, key_state, point, effect):
>         data = data_object.GetData((15, None, 1, -1, 1))
>         print data
>         n_files = shell.DragQueryFileW(data.data_handle, -1)
>         print n_files
>         filenames = [shell.DragQueryFileW(data.data_handle, n_file) 
> for n_file in range(n_files)]
>         print filenames
>         self.TargetWidget.filesDropped(filenames) # this calls the 
> filesDropped function of the TargetWidget class and passes the 
> filename list to it.
>
>     # this function is part of the GUI class (which inherits from 
> Tkinter.Toplevel) the print commands work however if i uncomment the 
> clearInput function (which just calls self.filepathInput.delete(0, 
> END) to clear the text)
>     # the program hangs, same for the second commented line, and 
> anything else that requires a call to tk it appears. Is there some 
> sort of conflict going on between win32 and Tk ??
>     def filesDropped(self, fileList):
>         print fileList
> #        self.clearInput()
> #        self.filepathInput.insert(Tkinter.END, fileList[0])
> [/code]
>
> I'm just wondering if there's something i need to do to 'release' the GUI?
> I'm pretty sure it's got nothing to do with my code elsewhere because 
> it was all working smoothly before, and if i call the filesDropped 
> function from somewhere else (not from the IDropTarget class) i don't 
> have any issues.
>
> Thanks in advance,
> Alex
This is just a guess, but you usually cannot update a GUI from an 
outside process directly. At least, this is true of wxPython. I think 
your blocking the idle event in Tkinter, which causes it to hang and 
then when you try to update it, Tkinter crashes because you're making a 
call on it from what amounts to a separate thread.

Instead, you ought to write to a file or post an event when the win32 
part is finished that the Tkinter GUI can check periodically and then 
react. In other words, have the win32 portion of your code write 
something to a file and have Tkinter check the file every few seconds 
and then update itself when it finds something in there.

In wxPython there is a way to subscribe to special events using the 
PubSub module. Tkinter probably has its own nomenclature. If you can't 
figure it out, I'd recommend the Tkinter mailing list.

Mike


More information about the python-win32 mailing list