2017-12-12 3 views
1

後に小文字を区別しないための変更ボタンの下に私のテストコードに見てみてください。のpython3 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() 

あなたはこの単純なアプリケーションを実行する場合は、そのボタンがサブプロセスの後、わずか5秒後に無効になりますわかります"sleep 5"を終了します。

質問 - サブプロセスを開始する前にボタンを非表示にする方法はありますか?

は、サブプロセスの呼び出しが結果としてメインループとユーザーインターフェースの非同期およびブロックではないので起こることを事前

答えて

1

でいただきありがとうございます。

したがって、このアプローチは正しくありません。

クリックした信号には、ボタンを押して離す必要がありますが、使用できる他の信号があります。 button-press-eventおよびbutton-release-eventコールバックのプロトタイプは、clickedから異なります。必要に応じて、そのイベントにアクセスできます。

あなたの質問に対する答えは、ボタン押下イベントへのコールバックを設定しますが、これは問題を解決しません!呼び出しは非同期でなければならず、GLib spawn async methodを使用することができます。

+0

"マルチプロセッシング"を使うことができます – user1078796

+0

おそらくサブプロセスからgtkメソッドを呼び出さないと問題はありません。あなたがメインループと通信したいとき、ストレスが発生します。パイプには問題があります。「2つのプロセス(またはスレッド)が同時にパイプの同じ端部を読み書きしようとすると、パイプ内のデータが壊れる可能性があることに注意してください。」キューは「スレッドとプロセスセーフ非同期呼び出しでなければならないことを忘れないでください。とにかく、私はあなたが問題を分離することをお勧めします。マルチプロセッシングを使用する特定の理由がない限り、GLibのtrhread /スレッドプールと非同期キューを試してみてください。 –

関連する問題