PyGTK вызов функции класса

Модератор: Модераторы разделов

pattern
Сообщения: 4
ОС: PCBSD 7

PyGTK вызов функции класса

Сообщение pattern »

Привет всем!
Никак не могу понять, как вызвать функцию из класса? У меня в проекте 2 файла: один описывает клас прорисовки окна, второй собственно вызывает этот класс, который так же в последствии должен передать окну некоторое событие, которые будет выполняться в ходе программы.
При запуске программы окно рисуется, однако вызов функции класса, которая изменяет метку в окне, вызывается только после закрытия окна.
Исходник основного файла (client.py):

Код: Выделить всё

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import gui_inform

gui = gui_inform.Gui_inform()
gui.main()
gui.showLabel(1, True)
"""
Выполняем какое то действие, получаем результат операции,
который передаем в следующую функцию в качестве второго параметра
(по умолчсанию True)
"""
gui.showLabel(2, True)

Исходник второго файла (gui_inform.py):

Код:

#!/usr/bin/python # -*- coding: UTF-8 -*- import pygtk pygtk.require('2.0') import gtk class Gui_inform: label1 = gtk.Label() label2 = gtk.Label() def delete_event(self, widget, event, data=None): gtk.main_quit() return False def destroy(self, widget, data=None): gtk.main_quit() return False def showLabel(self, lab_num, success=True): if lab_num == 1: self.label1.set_label('Идет подготовка данных . . . . . . .') self.label1.show() print "event 1" elif lab_num == 2: if success: self.label2.set_label('ОК') print "event 2 true" else: self.label2.set_label('Ошибка') print "event 2 false" self.label2.show() def __init__(self): self.initWindow() def initWindow(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_size_request(300, 100) self.window.set_resizable(False) self.window.set_title("Информатор") self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.window.set_border_width(10) self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS) hbox = gtk.HBox(False, 2) vbox1 = gtk.VBox(True, 5) self.label1.set_alignment(0, 0) vbox1.pack_start(self.label1, True, True, 2) self.label1.show() hbox.pack_start(vbox1, True, True, 2) vbox1.show() vbox2 = gtk.VBox(True, 5) self.label2.set_alignment(0, 0) vbox2.pack_start(self.label2, True, True, 2) self.label2.show() hbox.pack_start(vbox2, True, True, 2) vbox2.show() self.window.add(hbox) hbox.show() self.window.show() def main(self): gtk.main()

Результат работы: пустое окно и по завершении в консоли

Код: Выделить всё

event 1
event 2 true

Подскажите, как это правильно реализовать?
Спасибо всем отозвавшимся!
Your bunny wrote: its not a bug, this is a feature, actually...
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: PyGTK вызов функции класса

Сообщение Portnov »

Вызывать функцию, которая "Выполняем какое то действие, получаем результат операции", из Gui_inform.__init__().
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
pattern
Сообщения: 4
ОС: PCBSD 7

Re: PyGTK вызов функции класса

Сообщение pattern »

Portnov писал(а):
13.01.2009 16:41
Вызывать функцию, которая "Выполняем какое то действие, получаем результат операции", из Gui_inform.__init__().

:unsure: мммммм..... не совсем понял...
Из основного файла идет вызов gui.main(), который является Gui_inform.main(), в следствии чего запускает gtk.main() и подцепляет автоматом функцию Gui_inform.__init__(), ну и так далее . Или я не прав? Если не прав, тогда каким таким волшебным образом окно рисуется именно того, размера, которое задано в __init__()?
В любом случае, добавление вызова этой функции не дало никакого результата.
Your bunny wrote: its not a bug, this is a feature, actually...
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: PyGTK вызов функции класса

Сообщение Portnov »

Всё так. Просто у вас вызов "gui.showLabel(2, True)" делается уже после закрытия окна. А надо - до. Например, в функции __init__(), или в обработчике какого-нибудь события (по нажатию на кнопку, например).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
pattern
Сообщения: 4
ОС: PCBSD 7

Re: PyGTK вызов функции класса

Сообщение pattern »

Portnov писал(а):
13.01.2009 17:31
Всё так. Просто у вас вызов "gui.showLabel(2, True)" делается уже после закрытия окна. А надо - до. Например, в функции __init__(), или в обработчике какого-нибудь события (по нажатию на кнопку, например).

Спасибо за ответ! Ошибку понял, но решения проблемы пока не нашел. Дело в том, что на форме нет и не будет никаких кнопок, только label с информацией того, что выполняется главным скриптом. Судя по всему, придётся в все в gui'шнике писать, чего не очень то хотелось :(
Your bunny wrote: its not a bug, this is a feature, actually...
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: PyGTK вызов функции класса

Сообщение Portnov »

Логику вычислений можно вынести в отдельный модуль, если хотите.

worker.py:
def calculate_something()...

gui.py:

Код: Выделить всё

import worker

class GUI:
    def __init__(self):
        ...
        self.label.set_text(worker.calculate_something())
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали: