2

python2 と GTKBuilder を使用して GUI プログラミングを学習しようとしていますが、コードを実行するとセグメンテーション違反が発生します。これは Glade で GTKBuilder ファイルとして作成された私のファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="mainWindow">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkBox" id="box2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="halign">start</property>
            <property name="margin_left">146</property>
            <property name="margin_right">276</property>
            <child>
              <object class="GtkLabel" id="label1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">label</property>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkEntry" id="entryName">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="margin_bottom">4</property>
                <property name="hexpand">True</property>
                <property name="vexpand">True</property>
                <property name="invisible_char">●&lt;/property>
                <property name="placeholder_text">Please enter your name here...</property>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="buttonWriteNameToFile">
            <property name="label" translatable="yes">button</property>
            <property name="use_action_appearance">False</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="use_action_appearance">False</property>
            <signal name="clicked" handler="buttonWriteNameToFile_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>

この質問に基づく私のpythonコードは次のとおりです。

#!/usr/bin/env python

import gtk

class NameApp:
    def __init__(self):
        filename = "project.glade"
        builder = gtk.Builder()
        builder.add_from_file(filename)
        builder.connect_signals(self)
        builder.get_object("mainWindow").show_all() 

    def buttonWriteNameToFile_clicked(self, widget):
        print("File write code...")

if __name__ == "__main__":
    app = NameApp()
    gtk.main()

でファイルを実行すると、次のpython2エラーが発生します。

name.py:9: Warning: cannot create instance of abstract (non-instantiatable) type `GtkBox'
  builder.add_from_file(filename)
./geany_run_script.sh: line 5: 14897 Segmentation fault      python2 "name.py"

私はその例に可能な限り忠実に従ったと思っていましたが、GTKBuilder ファイル以外に違いは見られません。ただし、リンクされた質問の例は、私のマシンで正常に実行されます。関連するかどうかはわかりませんが、Arch Linux x86_64 を実行しています。

4

2 に答える 2

4

3.x バージョンを好む場合 (Glade ファイルで読み取ることができるため)、GObject Introspection モジュールの GTK を使用する必要があります。あなたの変更されたコードは次のとおりです。

#!/usr/bin/env python

#import gtk
from gi.repository import Gtk 

class NameApp:
    def __init__(self):
        filename = "test.glade"
        builder = Gtk.Builder()
        builder.add_from_file(filename)
        builder.connect_signals(self)
        builder.get_object("mainWindow").show_all() 

    def buttonWriteNameToFile_clicked(self, widget):
        print("File write code...")

if __name__ == "__main__":
    app = NameApp()
    Gtk.main()

GTK の 2.x バージョンでは、ウィジェットGtkBoxは抽象的であったため、インスタンス化できません。GtkHBox または GtkVBox を使用できます。

于 2012-06-16T09:30:13.370 に答える
0

Box通常のウィジェットである GTK 3.0 を使用して Glade ファイルを作成しました。GTK 2 では、これは抽象クラスであり、 または のいずれかを使用する必要がありVBoxますHBox。Python スクリプトは GTK 2 を使用しているため、Glade ファイルを読み込めません。

Glade のプロジェクト設定に移動し、3.0 より前の GTK バージョンを選択します。

于 2012-06-16T09:23:29.560 に答える