python - El objeto ''gi.repository.Gtk'' no tiene el atributo ''gdk''
multithreading raspberry-pi (1)
Creo que el equivalente del antiguo estilo gtk.gdk.threads_init()
es:
from gi.repository import Gdk
Gdk.threads_init()
Sin embargo, como advierte la pregunta frecuente , el enhebrado no es una forma clara de lograr este objetivo. Una forma mucho mejor es usar GObject.idle_add
para ejecutar una función siempre que la GUI esté inactiva.
"""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()
Estoy tratando de crear un hilo múltiple con GTK. Se necesita Gtk.gdk pero recibí un error sobre el atributo no gdk. Estoy usando una Raspberry Pi con Raspbian.
Así es como importo la biblioteca 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()
y este es el error que recibí
El objeto AttributeError''gi.repository.Gtk ''no tiene el atributo'' gdk ''
¿Alguna idea?
Actualizaciones: estoy siguiendo este tutorial http://faq.pygtk.org/index.py?req=show&file=faq14.023.htp que está utilizando tanto GObject.threads_init () como Gtk.gdk.threads_init (). No tengo problemas para usar GObject, sino gdk.