Python3 GTK3 - 单击后立即将按钮更改为不敏感

时间:2017-12-12 13:08:26

标签: python linux subprocess gtk3

请查看下面的测试代码:

import time
import subprocess
import os,re
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class MyWindow(Gtk.Window):
   def __init__(self):
      Gtk.Window.__init__(self, title="test")
      self.set_default_size(400, 190)
      self.set_border_width(10)
      fixed = Gtk.Fixed()
      self.add(fixed)

      self.button2 = Gtk.Button(label='press')
      self.button2.connect("clicked", self.aaabbb)
      self.button2.set_size_request(100, 20)
      fixed.put(self.button2, 170, 10)

   def aaabbb(self,widget):
      self.button2.set_sensitive(False)
      p = subprocess.run( ['/bin/bash','-c', '/bin/sleep 5'] )
      print(p.returncode)

window = MyWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

如果您运行这个简单的应用程序,您会注意到在子进程完成“sleep 5”后,该按钮仅在5秒后被禁用

问题 - 如何在子进程启动之前使按钮不敏感?

提前谢谢

1 个答案:

答案 0 :(得分:1)

这是因为子进程调用不是异步的,因此会阻塞主循环和用户界面。

所以,这种方法并不正确。

点击的信号需要按下并释放按钮,但您可以使用其他信号,例如。 button-press-eventbutton-release-event回调原型与clicked 不同,如果需要,您可以访问该活动。

你的问题的答案是,设置一个按钮按下事件的回调,但这不会解决你的问题!调用应该是异步的,并且要实现,您可以使用GLib spawn async method