Создайте графический интерфейс PyGTK с событием, чтобы перезагрузить себя - PullRequest
2 голосов
/ 04 февраля 2011

Я создаю макет макета GUI с PyGTK, иногда не использую glade / builder, а следующая сцена повторяется бесконечно:

  1. Изменение кода
  2. Запуск сценария GUI
  3. Оценка результата
  4. Изменение еще раз
  5. Выполнение еще раз ...

Итак, поскольку я слышал, что Python допускает перезагрузку модулей, я хотел быхотелось бы узнать, можно ли изменить код БЕЗ ЗАКРЫТИЯ ОКНА, а затем, из самого окна, скажем, нажав на кнопку, «перезагрузить» окно, отражающее изменения в коде.

Так как оноэто концептуальный вопрос, у меня нет конкретного кода для показа.

Спасибо за внимание

1 Ответ

1 голос
/ 04 февраля 2011

Я думаю, что это возможно, если вы сделаете следующее:

  1. Определите и изолируйте виджет W, который вы хотите видеть обновленным при нажатии кнопки (если вы хотите, чтобы все окно обновлялось, затем сделайте все, что вы добавляете в окно, а не само окно).
  2. Напишите функцию (или класс), которая создает и возвращает этот виджет
  3. Поместите эту функцию или класс в модульчто вы перезагрузите
  4. Создайте свою кнопку вне W и подключите ее к функции, которая выполняет следующие действия:
    • Удалите текущий W из окна
    • Перезагрузите модуль
    • Создайте новый экземпляр W
    • Добавьте его в окно

Конечно, критический шаг здесь - это «перезагрузить модуль».Я предполагаю, что вы должны убедиться, что код модуля не запущен, и никакой другой модуль не зависит от переменных, определенных в этом модуле.

РЕДАКТИРОВАТЬ: у меня было некоторое время, поэтому я сделал небольшой прототип.Измените метку в widget_module.py, а затем нажмите Обновить

gui.py

# Load in pygtk and gtk

import pygtk
pygtk.require('2.0')
import gtk
import widget_module

# Define the main window

class Whc:
    def __init__(self):
        # Window and framework
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("destroy", self.destroy)

        # A Button, with an action
        # Add it to the geometry
        # show the button
        self.button = gtk.Button("Update")
        self.button.connect("clicked", self.update, None)

        self.vbox = gtk.VBox()
        self.vbox.pack_start(self.button)
        self.widget = widget_module.get_widget()
        self.vbox.pack_start(self.widget)

        self.window.add(self.vbox)


        # Show the window
        self.window.show_all()

    # Callback function for use when the button is pressed

    def update(self, widget, data=None):
        print "Update"
        self.vbox.remove(self.widget)
        reload(widget_module)
        self.widget = widget_module.get_widget()
        self.vbox.pack_start(self.widget)
        self.widget.show()


    # Destroy method causes appliaction to exit
    # when main window closed

    def destroy(self, widget, data=None):
        gtk.main_quit()

    # All PyGTK applicatons need a main method - event loop

    def main(self):
        gtk.main()

if __name__ == "__main__":
    base = Whc()
    base.main()

widget_module.py

import pygtk
import gtk

def get_widget():
    return gtk.Label("hello")
...