pygtk gladeの質問:なぜこの単純なスクリプトが機能しないのですか?

StackOverflow https://stackoverflow.com/questions/308913

  •  08-07-2019
  •  | 
  •  

質問

私は、gladeを使用してUIをまとめる小さなpygtkアプリケーションを作成しています。すでに動作するいくつかのウィンドウを作成しましたが、何らかの理由でこのウィンドウは動作しません。次のトレースバックが表示されます。

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    class TestClass:
  File "test.py", line 10, in TestClass
    self.wTree.signal_autoconnect(self)
NameError: name 'self' is not defined

test.pyの内容は次のとおりです。

#!/usr/bin/env python

import pygtk
import gtk
import gtk.glade

class TestClass:
    def __init__(self):
        self.wTree = gtk.glade.XML("test.glade")
        self.wTree.signal_autoconnect(self)

    def on_TestClass_destroy(self, widget, data):
        gtk.main_quit()

if __name__ == "__main__":
    window = TestClass()
    gtk.main()

そして、ここにgladeファイル、test.gladeがあります:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Fri Nov 21 08:53:53 2008 -->
<glade-interface>
  <widget class="GtkWindow" id="TestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <signal name="destroy" handler="on_TestClass_destroy"/>
    <child>
      <placeholder/>
    </child>
  </widget>
</glade-interface>

奇妙なことに、signal_autoconnect(self)呼び出しを削除すると、ウィンドウが開きます。ただし、その呼び出しを&quot; self.on_TestClass_destroy(self、None、None)&quot;に置き換えた場合、代わりに、同じNameError例外を返します。

正常に機能する他のウィンドウクラスをいくつか作成したため、なぜこれが機能しないのか本当にわかりません。

次のコードはここで誰かのために働いていますか?

役に立ちましたか?

解決

このコードとウィンドウおよび信号接続はここで正常に機能します。

シグナルハンドラを呼び出すときに小さなバグがあります。ウィジェットのみが引数として渡されるため、シグナルハンドラにはデータ引数を指定しないでください。

def on_TestClass_destroy(self, widget):
    gtk.main_quit()

データ引数は、シグナルハンドラーに追加の状態が必要な場合に備えて、接続時に提供されるもののみです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top