2012-01-24 21 views
3

私のアプリケーションでは、glib.timeout_add_seconds()のおかげで、GtkInfoBarsにタイムアウト(説明はhttps://stackoverflow.com/a/1309257/406281)を表示する関数を使用しています。pygtk glib.timeout_add():タイマーが破壊されていないかどうかを確認するには?

glib.timeout_add_seconds()は、関数がFalseを返すまで一定の間隔で呼び出される関数を設定するはずです。

私はそれをしていませんが、すべて期待どおりに動作します。それは完全にシンプルです。ここに私のコード:

def infobar(self, message, msgtype=gtk.MESSAGE_INFO, timeout=5): 
    bar = gtk.InfoBar() 
    bar.set_message_type(msgtype) 
    bar.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) 
    bar.connect("response", lambda *args: bar.hide()) 
    self.vb2.pack_end(bar, False, False) 
    label = gtk.Label() 
    label.set_markup(message) 
    content = bar.get_content_area() 
    content.add(label) 
    label.show() 
    bar.show() 
    if timeout: 
     glib.timeout_add_seconds(timeout, bar.hide) 

です。質問時間。最後の行で何をしたかを見てください。簡単に言えば、これは大丈夫ですか? bar.hide()への2回目の呼び出しが失敗した後、タイムアウトは自動的に破棄されますか?あるいは、資源を使い切って5秒ごとに目を覚ます余分な中和タイムアウトを蓄積していますか?補遺として


私は疑うように、これは悪いです、と私は本当にタイムアウトを破壊するためにFalseを返す必要がない、場合、私はいくつかの助けを必要とする - 私はできませんこれらの条件を満たすためにコードをどのように使いこなすかを理解する:複数のInfoBarsを同時に有効にする必要があり、それぞれが独自のタイマーとボタン応答信号(コードが今のように)に接続された状態でOR前回のInfoBarを置き換えるために、新しいInfoBarがそれぞれ必要です(前のInfoBarからタイマーを継承せずにこれを行う方法を理解できません。

読んでいただきありがとうございます! bar.hide

答えて

4

Widget.hideは常にNoneを返します。glib.timeout_add_secondsは、Falseと同じように扱われます。したがって、あなたのタイマーは一度実行した後に常に終了します。 hideが2回呼び出される可能性があります(ユーザーが[OK]をクリックして5秒間にタイムアウトしたとき)が、それは問題ありません。だから、コードは問題ありません。

編集:ちょうど何かを実現しました。関数を実行するたびに新しい情報バーを作成してから、それを隠すだけです。 hideの代わりにdestroyを使用すると、正しくクリーンアップされます。

...または私は以前のものを(私は、以前の情報バーからタイマーを継承せずにこれを行う方法を見つけ出すことはできません - それは乱雑取得)を交換するために、それぞれの新しい情報バーを必要としています。

これはあまり複雑ではありません。同じ情報バーを再利用するだけです。 glib.timeout_add_secondsという戻り値を記録し、情報バーの内容を置き換えながら、前のタイマーをglib.source_removeで終了します。

あなたが提示する2つの選択肢の間にユーザビリティのトレードオフがあります(UIのクリーンアップとユーザーの重要な情報の欠落を確認する)が、それは別の話題であり、おそらくそれほど重要ではありません。

+0

ああ!驚くばかり!私はPythonとgtkの新機能ですので、hideとvs destroyの説明に感謝します。そして、glib.source_remove情報で、私は選択肢があります。私はあなたが話している使いやすさのトレードオフという決定に苦労していました...私は分かりません。私は、情報バーを使用するgtkアプリのいくつかの例を探したいと思います。うーん。とにかく、もう一度ヨハネスに感謝! – rsaw

6

が複数回呼び出されて、私はそれが私の知る限り、十分なはずFalsebar.hide戻りNoneとして評価された値を返すために十分なはずです、なぜなら起きていないと思います。あなたは完全に確認する場合は、あなたがこのような何かを確認することができます。この例では

import gtk, glib 

def callback(): 
    print 'called' 

glib.timeout_add_seconds(1, callback) 
gtk.main() 

、コールバックは、同様にNoneを返し、あなたは出力からstdoutに見ることができるように一度だけ呼ばれています。

あなたの最終的な質問については、これはすでに、複数の情報バーにそれぞれ別のタイマーを持つ許容可能な方法だと思います。私が何かが欠落している場合は、さらに情報を追加してください。

+0

ありがとうございます@jcollado!あなたの最後の2つの文について:いいえ、あなたは何も欠けていません。私はこのコードが成し遂げた結果が好きです。コード自体が大丈夫かどうかはわかりませんでした。再度、感謝します。 – rsaw

関連する問題