положить интерфейс поляны в Python - PullRequest
9 голосов
/ 04 сентября 2011

Я сделал графический интерфейс на поляне, который хочу добавить в программу на python. Я адаптировал инструкции из учебника, который я нашел в Интернете, для загрузки в свой файл glade (http://www.pygtk.org/articles/pygtk-glade-gui/Creating_a_GUI_using_PyGTK_and_Glade.htm).). Когда у меня возникли проблемы, я попробовал что-то простое (одна кнопка), назвав это так же, как в этом учебнике, и скопировал, вставив их код, и это все еще не работало. Я также взглянул на (http://www.linuxjournal.com/article/6586?page=0,2),, в котором функция вызывается немного по-другому ("self.wTree = gtk.glade.XML (gladefile, windowname)" вместо без windowname), и реализовал эквивалент с моим, и это не исправило это. У меня определенно работает pygtk, я сделал что-то без использования Glade прежде, и это работало нормально. Я получаю ошибку:

/usr/share/themes/NOX/gtk-2.0/gtkrc:233: Murrine configuration option "gradients" 
 is no longer supported and will be ignored.

(helloWorld.py:9804): libglade-WARNING **: Expected <glade-interface>.  Got    
 <interface>.

(helloWorld.py:9804): libglade-WARNING **: did not finish in PARSER_FINISH state
Traceback (most recent call last):
File "helloWorld.py", line 31, in <module>
hwg = HellowWorldGTK()
File "helloWorld.py", line 22, in __init__
self.wTree = gtk.glade.XML(self.gladefile) 
RuntimeError: could not create GladeXML object

Я использую xubuntu 11.04. Конфигурация Murrine возникает при открытии любого gtk-приложения, но я включил его на случай, если это уместно. Вот код, который я взял из учебника (но не работает)

#!/usr/bin/env python

import sys
try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

class HellowWorldGTK:
"""This is an Hello World GTK application"""

def __init__(self):

    #Set the Glade file
    self.gladefile = "PyHelloWorld.glade"  
    self.wTree = gtk.glade.XML(self.gladefile) 

    #Get the Main Window, and connect the "destroy" event
    self.window = self.wTree.get_widget("MainWindow")
    self.window.show()
    if (self.window):
        self.window.connect("destroy", gtk.main_quit)


if __name__ == "__main__":
    hwg = HellowWorldGTK()
    gtk.main()

Ответы [ 5 ]

10 голосов
/ 10 сентября 2011

Попробуйте с этим кодом:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade

class HellowWorldGTK:

    def __init__(self):
        self.gladefile = "helloworld.glade" 
        self.glade = gtk.Builder()
        self.glade.add_from_file(self.gladefile)
        self.glade.connect_signals(self)
        self.glade.get_object("MainWindow").show_all()

    def on_MainWindow_delete_event(self, widget, event):
        gtk.main_quit()

if __name__ == "__main__":
    try:
        a = HellowWorldGTK()
        gtk.main()
    except KeyboardInterrupt:
        pass

Помните: В Glade измените «Предпочтения» файла на « GTKBuilder » (не «libglade»)

4 голосов
/ 04 сентября 2011

Ваш PyHelloWorld.glade неверен.Убедитесь, что вы создали его с правильным приложением Glade, есть приложения Glade2 и Glade3, которые можно установить и использовать.Если вы скачали файл, убедитесь, что он правильный.Сообщение об ошибке говорит само за себя:

Expected <glade-interface>.  Got  <interface>

Таким образом, XML-файл имеет тег интерфейса, а библиотека PyGTK ожидает тег glade-interface.

1 голос
/ 10 ноября 2013

Так как у меня всегда возникают проблемы с этим, вот код Python 2.7, который я использую для одного или другого:

для Libglade:

# needs libglade (not for gtk-builder)
import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade

gladefile = "test-libglade.glade"
wTree = gtk.glade.XML(gladefile)
window = wTree.get_widget("MainWindow")
if (window):
  window.connect("destroy", gtk.main_quit)

window.show_all() # must have!
gtk.main()

Для GtkBuilder:

# needs gtk-builder (not for libglade)
import pygtk
pygtk.require("2.0")
import gtk

gladefile = "test-gtkbuilder.glade"
wTree = gtk.Builder()
wTree.add_from_file(gladefile)
window = wTree.get_object("MainWindow")
if (window):
  window.connect("destroy", gtk.main_quit)

window.show_all() # must have!
gtk.main()

В Glade вы можете просто добавить окно, назвать его MainWindow и сохранить две версии с соответствующими именами файлов, как указано выше для каждого формата; и эти фрагменты должны работать с ними соответственно.

Надеюсь, это кому-нибудь поможет,
Ура!

0 голосов
/ 07 июня 2018

Если вы используете GTK + 3 в Python, см. builder .

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class Handler:
    def onDestroy(self, *args):
        Gtk.main_quit()

    def onButtonPressed(self, button):
        print("Hello World!")

builder = Gtk.Builder()
builder.add_from_file("builder_example.glade")
builder.connect_signals(Handler())

window = builder.get_object("window1")
window.show_all()

Gtk.main()
0 голосов
/ 20 декабря 2013

Это работает отлично.

#!/usr/bin/python
import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade
class SubinsWindow:
 def __init__(self):
  self.gladefile = "game.glade"
  self.glade = gtk.Builder()
  self.glade.add_from_file(self.gladefile)
  self.glade.connect_signals(self)
  self.win=self.glade.get_object("window1") # Window Name in GLADE
  self.win.show_all()

if __name__ == "__main__":
 a = SubinsWindow()
 gtk.main()
...