Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Python 3 + PyGObject Как графически отобразить процесс инициализации класса  (Прочитано 1435 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Есть основной класс окна, возможно ли отобразить процесс инициализации этого окна (класса) в другом не модальном окне в виде прогресса т.е. все что есть в
def __init__(self):Отобразить прогресбаром в другом окне?
Надеюсь понятно изложил вопрос)

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ivsatel, наверняка можно. В классе, который создаёшь прописываешь увеличить значение индикатора и всё.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Не очень представляю себе реализацию
Код: (python) [Выделить]
import threading
import time
from gi.repository import Gtk, GObject, GLib

class ProgressBarWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressBar")
        self.set_border_width(20)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.progressbar = Gtk.ProgressBar()
        vbox.pack_start(self.progressbar, True, True, 0)
        self.show_all()
        Gtk.main()

    def on_activity(self, *args):
        self.progressbar.set_fraction(args[0])


class TopWindow(Gtk.Window):


    def __init__(self):

        self = Gtk.Window()

        self.s = ProgressBarWindow()

        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.20)

        self.set_border_width(5)

        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.40)

        self.connect("delete-event", Gtk.main_quit)

        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.60)

        self.set_default_size(150, 150)

        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.80)

        self.spinner = Gtk.Spinner()
        self.spinner.start()

        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 1.00)

        self.add(self.spinner)
        self.show_all()


myspinner = TopWindow()
Gtk.main()
« Последнее редактирование: 18 Июля 2015, 20:05:45 от ivsatel »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ivsatel, псеводокод
создаётся окно с прогресбаром
вызывается конструктор
цикл(каждая итерация|действие - увеличение состояния)
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
alsoijw,
Я с легка если можно так сказать запутался) Вот пример:
(Нажмите, чтобы показать/скрыть)
Из класса основного окна создаю окно с прогресбаром. Далее попытки изменить значение ни к чему не приводят...

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ivsatel, с питоном знаком поверхностно. Попробуй передавать прогресбар как аргумент конструктору.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
alsoijw,
Думаю тут вопрос не к питону а больше к GTK, а именно к Gtk.main()
Вот тут уже ближе, но через раз вылетает с ошибкой:
(Нажмите, чтобы показать/скрыть)
(Test-21.py:26491): Gdk-WARNING **: Test-21.py: Fatal IO error 11 (Ресурс временно недоступен) on X server :0.
« Последнее редактирование: 19 Июля 2015, 09:36:47 от ivsatel »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ivsatel, псевдокод
конструктор аргумент прогресбар...
  действие
  увеличение прогресбара
  действие
  увеличение прогресбара
  ...
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Алгоритм тут понятен. Мне не очень понятно как и где "запускать" основной цикл "Gtk.main()"...
Например что-бы двигался прогресс Gtk.main() нужно запустить в отдельном потоке, но вот как после завершить первый Gtk.main() и запустить второй, для основного окна, прогресс инициализации которого отображался не пойму.
А может и вовсе не правильный подход...

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ivsatel, в первом отображаемом окне пишешь Gtk.main() Во втором окне ничего писать не надо
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Во втором окне ничего писать не надо
А вот тут наверное особенности python и реализации PyGObject
Иначе не работает. Хотя может тут моя вина.

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Я плохо знаком с GTK, но ведь элементы интерфейса создаются в "главном потоке"? Т.е. если в этом потоке делать длительные операции, то ничего другого (в том числе и изменения прогресс бара) отрисовываться не будет.

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
aSmile,
Для этого и запускаю основной поток в отдельном потоке по средствам (threading.Thread). Но по завершению работы конструктора, создаю для нового окна новый поток, обычный, не используя (threading.Thread), а первый поток убиваю.
Этот подход правильный вообще?

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Вопрос в том, можно ли создавать гуи-объекты в не-гуи потоке?

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
aSmile,
Первый ГУИ создаётся/вызывается в конструкторе и по завершению создания первого ГУИ как положено запускается цикл Gtk.main().
После продолжается работа конструктора с отображением работы в первое созданное окно.
По завершению работы конструктора, первый цикл Gtk.main() останавливается и запускается второй.

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.