gpt4 book ai didi

python - 在 PyGTK 中,如何使用线程?

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:31 24 4
gpt4 key购买 nike

我有一个使用 gtk 绘制 GUI 的类。

点击一个按钮将调用一个方法,该方法将运行一些外部程序。

但在此期间 GUI 可能不会重绘。

一种解决方案可能是使用线程。这example创建一个线程在 GUI 类之外并在调用 gtk.main() 之前启动它。

如何让 GUI 类之外的线程检测按钮单击事件并调用合适的方法?

最佳答案

你不需要另一个线程来启动外部程序,你可以使用 Gtk 的空闲循环。这是我为此编写的一些程序。它必须读取程序的标准输出以在 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!

关于python - 在 PyGTK 中,如何使用线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com