1

MySQL データベースの変更をチェックし続け、それに応じて GTK 表示を更新するプログラムを作成しています。チェックし続ける部分が無限ループ。

私が望むのは、GTK ウィンドウが閉じられたら、無限ループから抜け出すことができるということです。

しかし、そのためにどのような条件を使用すればよいかわかりません。私はもう試した

if !window:

if window == None:

しかし、どちらの場合も機能しません。

私のコードの構造は次のようになります。

while True:

    # my code

    while gtk.events_pending():
         gtk.main_iteration()

    # something to exit here

window.connect("destroy", gtk.main_quit())

ウィンドウが正常に閉じているように見えるため、そこに「window.connect」を配置すると問題が発生する可能性があるかどうかはわかりません。また、ループ内またはループの前に配置すると、Runtime Error: called outside of mainloop が発生します。

繰り返しになりますが、ウィンドウの閉鎖を条件として使用して無限ループを終了するにはどうすればよいでしょうか? ユーザーが Ctrl + C を使用する必要がないようにします。

前もって感謝します!

4

2 に答える 2

1

これは、古典的なバックグラウンド スレッドの問題です。次のようなループが必要です。

closing = False

while not closing:
    // do the MySQL stuff

そして、信号ハンドラーをウィンドウ破棄イベントに接続して、閉じるをTrueに設定します

于 2012-07-26T19:52:05.947 に答える
0

pygtkアプリの基本構造は、通常、次のようなものです。

win = gtk.MyWindow()
win.connect("destroy", gtk.main_quit)  # Note no paretheses after main_quit. 
gobject.timeout_add(1000, win.check_DB)  
win.show_all()
gtk.main()

このgobject.timeout_addコマンドは、win.check_DB1000ミリ秒ごとにメソッドを呼び出します。


で、 win.connect("destroy", gtk.main_quit)の後に括弧を付けないことが重要main_quitです。gtk.main_quit関数オブジェクトをメソッドに渡しますがwin.connect、呼び出したときの戻り値ではありませんgtk.main_quit()。これは、括弧を追加した場合に発生します。

アプリを終了するためgtk.main_quit()、ここで括弧を使用すると、プログラムが早く停止します。

于 2012-07-26T19:56:25.810 に答える