在PyGTK中,如何使用线程?
作者:互联网
我有一个使用gtk绘制GUI的类.
单击一个按钮将调用将在外部运行一些方法
程式.
但是在此期间,GUI可能不会重绘.
一种解决方案可能是使用线程. example创建一个线程
在GUI类外部,并在调用gtk.main()之前启动它.
如何使GUI类之外的线程检测按钮单击事件并调用
合适的方法?
解决方法:
您不需要其他线程来启动外部程序,可以使用Gtk的空闲循环.这是我为此编写的一些程序.它必须读取程序的stdout才能在GUI上显示它的一部分,因此我将其留在了那里.变量“ job_aborted”与“中止”按钮绑定,该按钮允许提前终止.
class MyWindow ...
# here's the button's callback
def on_simulate(self, button):
self.job_aborted = False
args = self.makeargs() # returns a list of command-line args, first is program
gobject.idle_add(self.job_monitor(args).next)
def job_monitor(self, args):
self.state_running() # disable some window controls
yield True # allow the UI to refresh
# set non-block stdout from the child process
p = subprocess.Popen(args, stdout=subprocess.PIPE)
fd = p.stdout.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
while True:
if self.job_aborted:
os.kill(p.pid, signal.SIGTERM)
break
poll = p.poll()
if poll is not None:
break
try:
line = p.stdout.readline()
if line:
line = line.strip()
# update display
except IOError:
pass
yield True
self.state_ready() # re-enable controls
if self.job_aborted:
# user aborted
else:
# success!
标签:multithreading,gtk,pygtk,python 来源: https://codeday.me/bug/20191102/1992882.html