Объект "gi.repository.Gtk" не имеет атрибута "gdk"

Я пытаюсь создать несколько потоков с помощью GTK. Gtk.gdk требуется, но я получил ошибку об отсутствии атрибута gdk. Я использую Raspberry Pi с Raspbian.

Вот как я импортирую библиотеку GTK.

try:  
    import pygtk
    pygtk.require("2.0")  
except:  
    pass  

try:  
    from gi.repository import Gtk
except:  
    print("GTK Not Available")
    sys.exit(1)

Gtk.gdk.threads_init()

и это ошибка, которую я получил.

AttributeError'gi.repository.Gtk 'объект не имеет атрибута' gdk '

Любая идея?

Обновления: я следую этому руководству http://faq.pygtk.org/index.py?req=show&file=faq14.023.htp котором используются как GObject.threads_init(), так и Gtk.gdk.threads_init(). У меня нет проблем с использованием GObject, но GDK.

2 ответа

Решение

Я думаю, что эквивалент старого стиля gtk.gdk.threads_init() является:

from gi.repository import Gdk
Gdk.threads_init()

Тем не менее, как часто задаваемые вопросы предупреждают, многопоточность не является чистым способом достижения этой цели. Гораздо лучший способ заключается в использовании GObject.idle_add запускать функцию всякий раз, когда графический интерфейс простаивает.


"""Show a shell command's output in a gtk.TextView without freezing the UI"""

import os
import locale
import subprocess
import shlex
import gi.repository.Gtk as gtk
from gi.repository import GObject
PIPE = subprocess.PIPE

encoding = locale.getpreferredencoding()


def utf8conv(x):
    return unicode(x, encoding).encode('utf8')


class MyWindow:
    def __init__(self):
        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        textview = gtk.TextView()
        textbuffer = textview.get_buffer()
        sw.add(textview)
        win = gtk.Window()
        win.resize(300, 500)
        win.connect('delete-event', gtk.main_quit)

        self.button_sim = gtk.Button(u"Press me!")
        self.button_abort = gtk.Button("Abort")
        self.button_quit = gtk.Button("Quit")

        command = 'ls -R %s' % (os.getcwd(),)
        self.button_sim.connect(
            "clicked", self.on_button_clicked, textview, textbuffer, command)
        self.button_abort.connect("clicked", self.on_abort)
        self.button_quit.connect("clicked", self.main_quit)

        vbox = gtk.VBox()
        vbox.pack_start(self.button_sim, expand=False, fill=False, padding=0)
        vbox.pack_start(self.button_abort, expand=False, fill=False, padding=0)
        vbox.pack_start(self.button_quit, expand=False, fill=False, padding=0)
        vbox.pack_start(sw, expand=True, fill=True, padding=0)
        win.add(vbox)
        win.show_all()

    def read_output(self, view, buffer, command):
        yield True  # allow the UI to refresh
        proc = subprocess.Popen(
            shlex.split(command), stderr=PIPE, stdout=PIPE)
        while True:
            if self.job_aborted:
                print('user aborted')
                proc.terminate()
                break

            try:
                line = proc.stdout.readline()
                if line:
                    it = buffer.get_end_iter()
                    buffer.place_cursor(it)
                    buffer.insert(it, utf8conv(line))
                    view.scroll_to_mark(buffer.get_insert(), 0.1,
                                        use_align=False, xalign=0.5, yalign=0.5)

            except IOError:
                pass

            yield True

        yield False

    def on_button_clicked(self, button, view, buffer, command):
        self.job_aborted = False
        GObject.idle_add(self.read_output(view, buffer, command).next)

    def on_abort(self, button):
        self.job_aborted = True

    def main_quit(self, obj):
        self.job_aborted = True
        gtk.main_quit()


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

Поскольку вы используете gtk из gi.repository.Gtk, вы можете попытаться получить gdk аналогичным образом, но учтите, что его атрибут может отличаться от исходного gtk.gdk.

      from gi.repository import Gdk as gdk
Другие вопросы по тегам