2012-06-16 3 views
2

python2 및 GTKBuilder를 사용하여 GUI 프로그래밍을 배우려고하는데 코드를 실행할 때 분할 오류가 발생합니다. 이것이,파이썬 스크립트/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">●</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> 

내 파이썬 코드, this question에 따라 :

: python2으로 파일을 실행

#!/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() 

이 오류를 얻을 이것은 GTKBuilder 파일로 습지에서 만든 내 파일입니다

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

3.x 버전을 선호하는 경우 (Glade 파일에서 읽을 수 있음) GObject Introspection 모듈의 GTK를 사용해야합니다. 귀하의 수정 된 코드는 다음과 같습니다. GTK의 2.X 버전에서

#!/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() 

위젯 GtkBox 추상, 그래서 당신은 그것을 인스턴스화 할 수 없습니다. GtkHBox 또는 GtkVBox를 사용할 수 있습니다.

+0

'self.builder.get_object ("entryName"). get_text()'throws 이후로 버튼 안의 텍스트 입력 필드의 내용을 참조하는 방법을 알아 내는데 어려움이 있지만 문제가 해결되었습니다. '빌더'가 '자기'에서 발견되지 않는다는 오류. 나는 그것이 파이썬/gtk의 버전과 관련이 있는지 여부는 모르겠다. –

0

Box이 일반 위젯 인 GTK 3.0을 사용하여 Glade 파일을 만들었습니다. GTK 2에서는 추상 클래스이므로 VBox 또는 HBox 중 하나를 사용해야합니다. 파이썬 스크립트는 GTK 2를 사용하기 때문에 Glade 파일을로드 할 수 없습니다.

Glade의 프로젝트 환경 설정으로 이동하여 3.0보다 낮은 GTK 버전을 선택하십시오.

관련 문제