Создайте графический интерфейс PyGTK с событием, чтобы перезагрузить себя
Я создаю макет GUI с помощью PyGTK, иногда использую glade/builder, а следующая сцена повторяется бесконечно:
- Изменить код
- Запустите скрипт GUI
- Оцените результат
- Изменить снова
- Беги снова...
Итак, поскольку я слышал, что Python позволяет перезагружать модули, я хотел бы знать, возможно ли изменить код БЕЗ ЗАКРЫТИЯ ОКНА, а затем, из самого окна, скажем, нажав кнопку, "перезагрузить" окно отражающие изменения в коде.
Поскольку это концептуальный вопрос, у меня нет конкретного кода для показа.
Спасибо за внимание
1 ответ
Я думаю, что это возможно, если вы сделаете следующее:
- Определите и изолируйте виджет W, который вы хотите видеть обновленным, когда вы нажимаете кнопку (если вы хотите, чтобы все окно обновлялось, сделайте все, что вы добавляете в окне, а не само окно).
- Напишите функцию (или класс), которая создает и возвращает этот виджет
- Поместите эту функцию или класс в модуль, который вы перезагрузите
- Создайте свою кнопку вне 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")