[Urwid] run long time command in urwid

Ian Ward ian at excess.org
Tue Nov 23 20:38:35 EST 2010


Naihong Tang wrote on 2010-11-23 17:27:
> Thank you, Ian.
> 
> OnButtonPressed is Button's on_press callback, Run is MainLoop's run()
> method, sorry for inaccurate expression.
> The RAID building including a sequence of commands. Some commands are
> synchronized, I mean the command will run until the operation finished.
> Other commands are unsynchronized, after send the command, it will
> finish immediately,  polling is needed to get the status and result. I
> have already done this part with pexpect module. Now I want to integrate
> it with urwid, so the user can adjust some system parameters at
> beginning. Seems start a thread will be the right choice.
> I have another question, can the working thread call urwid to update the
> GUI interface, or only the main thread can do it.

You should only use the main thread to update the UI, or both threads
might try to update it simultaneously with poor results.

The solution is to use a pipe that you write to from in the worker
thread (or process) and pass the read end to
loop.event_loop.watch_file() in the main thread (or process).  The
function you pass to watch_file will be called any time the pipe is
readable, so you empty the pipe, update your UI and call loop.draw_screen()

This question comes up enough that I should write a good example to
point people to.  I'll post to the list when that happens.

Ian



More information about the Urwid mailing list