[Tutor] How to close a Tkinter window from a different thread?

Cameron Simpson cs at zip.com.au
Thu May 28 01:03:52 CEST 2015


On 27May2015 16:42, boB Stepp <robertvstepp at gmail.com> wrote:
>Python 2.4.4, Solaris 10
>I realize that this is a bit old, but I got severely sidetracked! ~(:>)
[...]
>On Mon, Apr 20, 2015 at 2:10 AM, Alan Gauld <alan.gauld at btinternet.com> wrote:
>> I would suggest forgetting about windows and think about
>> the processes that create them. Use the OS tools (via
>> the os module) to see if the first process is still running.
>> If so kill the process - which will in turn kill the window.
>
>Is this a reasonable way to determine if a given pid is still active?
>I found this at:
>
>http://stackoverflow.com/questions/568271/how-to-check-if-there-exists-a-process-with-a-given-pid
>
>import os
>
>def check_pid(pid):
>    """ Check For the existence of a unix pid. """
>    try:
>        os.kill(pid, 0)
>    except OSError:
>        return False
>    else:
>        return True
>
>I realize that this will also return True if I don't have permissions
>to kill, or some such.

Yes it is reasonable and normal. However the clean way to do it involves an 
extra test:

     try:
         os.kill(pid, 0)
     except except OSError as e:
         if e.errno == errno.EPERM:
           return True
         return False
     else:
         return True

Do bear in mind that process ids repeat. So on a busy system (or if your own 
program is very long lived and the original process exited a long time ago) you 
might be polling that pid as used by something unrelated.

However, if you started the process directly and it has not been wait()ed for, 
then the pid will not be available for reuse and you will be ok.

>> You can find the process based on its name or based on
>> its PID which you could store in a file somewhere
>> (like in /tmp?)
>
>I can implement this, but thinking about this anew has led to a
>concern. Hypothetically, if I check for the existence of a running
>process based on this stored pid, what is the likelihood that the pid
>will be reassigned to something other than one of my program's windows
>left open?

As discussed above. Possible but unlikely. And if you are the creator of the 
original process you can control the situation.

Cheers,
Cameron Simpson <cs at zip.com.au>

Processes are like potatoes.    - NCR device driver manual


More information about the Tutor mailing list