Найти - Пользователи
Полная версия: wxPython: взаимодействие между формами
Начало » GUI » wxPython: взаимодействие между формами
1 2
VasCraft
Доброго времени суток.
Постановка вопроса такова. Имеется два фрейма, один из них основной, другой дочерний, причем дочерний вызывается по событию из кнопки основного примерно по такой функции
    def OnIdentif(self, evt):
window1 = testframe(None, -1, 'Hi')
window1.Show()
self.Hide()
Теперь собственно вопрос. Как из младшего фрейма по закрытию или по другому действию, это не суть важно, развернуть старший, а если в старшем были какие-то данные, чтобы не затирались? Есть конечно, вариант события для дочерней формы, типа
    def OnCloseWindow(self, event):
window0 = identif(None, -1)
window0.Show()
## self.Hide()
self.Destroy()
но, что при self.Hide(), что при self.Destroy() данные теряются, и, что более обидно, при повторном вызове второго фрейма модуль, ему соответствующий, не находится, а выводится сообщение:
Traceback (most recent call last):
File "C:\Python25\Projects\identif.py", line 26, in OnIdentif
window1 = testframe(None, -1, 'Hi')
NameError: global name 'testframe' is not defined
Я понимаю, что искомый модуль не находится, но что делать, пока не понятно.
pyuser
VasCraft
но, что при self.Hide(), что при self.Destroy() данные теряются
ну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
Зачем прятать “старшее” окно при показе младшего? Может целесообразнее вместо Show использовать ShowModal?
VasCraft
pyuser
VasCraft
но, что при self.Hide(), что при self.Destroy() данные теряются
ну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
Зачем прятать “старшее” окно при показе младшего? Может целесообразнее вместо Show использовать ShowModal?
Суть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.
Vader
VasCraft
Суть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.
Не могу понять зачем это нужно. Если дочернее окно - модальное, то пользователь не сможет изменить что-то в старшем окне или скопировать что-нибудь из него. Если же вы опасаетесь, что он может какие-то данные перенести из старшего окна в младшее вручную, то он может это сделать и по памяти.
Если уж очень хочется прятать окна, то передавайте в дочернее окно ссылку на объект старшего окна и в методе OnCloseWindow делайте для этого окна Show().
И наконец, если вы все-таки решили остановиться на варианте “прятать/показывать”, то задумайтесть над вариантом исользования нескольких панелей в одном окне, вместо нескольких отдельных окон.
VasCraft
Vader
Если уж очень хочется прятать окна, то передавайте в дочернее окно ссылку на объект старшего окна и в методе OnCloseWindow делайте для этого окна Show().
Интересный вариант. Если можно, приведите примерный код, как это сделать.

Vader
И наконец, если вы все-таки решили остановиться на варианте “прятать/показывать”, то задумайтесть над вариантом исользования нескольких панелей в одном окне, вместо нескольких отдельных окон.
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.
Vader
VasCraft
Интересный вариант. Если можно, приведите примерный код, как это сделать.
Ну со сылкой я погорячился, забыл, что у окон тоже есть свойство Parent, так что при создании дочернего окна делате так
window1 = testframe(self, wx.ID_ANY)
self.Hide()
а в методе OnCloseWindow этого дочернего окна так:
self.Parent.Show()
self.Destroy()
Но, еще раз повторяю, не делайте так. Пользователи вас проклянут :)
Хотя, может у вас мега-супер уникальная задача, тогда конечно извращайтесь на здоровье.

VasCraft
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.
Notebook не нужен. Просто Panel.
И почему не подходит? Исходя из того, что вы написали, мне этот вариант кажется более правильным.
VasCraft
Vader
VasCraft
Интересный вариант. Если можно, приведите примерный код, как это сделать.
Ну со сылкой я погорячился, забыл, что у окон тоже есть свойство Parent, так что при создании дочернего окна делате так
window1 = testframe(self, wx.ID_ANY)
self.Hide()
а в методе OnCloseWindow этого дочернего окна так:
self.Parent.Show()
self.Destroy()
Спасибо, помогло! :)

Vader
Но, еще раз повторяю, не делайте так. Пользователи вас проклянут :)
Хотя, может у вас мега-супер уникальная задача, тогда конечно извращайтесь на здоровье.
:) Насчет пользователей и проклятия можно поподробнее? :)

Vader
VasCraft
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.
Notebook не нужен. Просто Panel.
И почему не подходит? Исходя из того, что вы написали, мне этот вариант кажется более правильным.
А вот тут непонятно. Вы предлагаете загонять несколько различных панелей друг на друга, а в качестве родителя каждой назначать сам фрейм приложения, а в процессе различных манипуляций скрывать/показывать их.

Или более веселый вариант налепливания и раскрытия/сокрытия различных виджетов на панели?
Vader
VasCraft
Насчет пользователей и проклятия можно поподробнее?
Если коротко, то вы, видимо, пытаетесь изобрести велосипед, а пользователи велосипедов не любят. Исчезающие в никуда и появляющиеся из ниоткуда окна, вызывают, как минимум, недоумение, и очень часто просто раздражают.
VasCraft
А вот тут непонятно. Вы предлагаете загонять несколько различных панелей друг на друга, а в качестве родителя каждой назначать сам фрейм приложения, а в процессе различных манипуляций скрывать/показывать их.
Да, именно так. Создаете нужно количество панелей из которых видимой в каждый момент времени является только одна, по мере необходимости добавляете/убираете их из сайзера родительского окна. У этого способа, множество преимуществ перед тем, что вы пытаетесь сделать:
- только одно окно, т.е. раздражающих окон, выскакивающих где попало, нет
- всю логику можно писать в одном месте, а не размазывать ее по десятку разных окон
- при необходимости, можно сделать навигацию типа Previos/Next
- и т.д. и т.п.

Из-за того, что вы держите в тайне предназначение вашего приложения, трудно что-то советовать. Но судя по тому, что вы пытаетесь сделать, у меня создается впечатление, что это некий wizard, так вот для wizard'a вариант с панелями подходит больше всего (хотя, если это действительно wizard, то лучше воспользоваться уже готовым из библиотеки).
VasCraft
Vader
Из-за того, что вы держите в тайне предназначение вашего приложения, трудно что-то советовать. Но судя по тому, что вы пытаетесь сделать, у меня создается впечатление, что это некий wizard, так вот для wizard'a вариант с панелями подходит больше всего (хотя, если это действительно wizard, то лучше воспользоваться уже готовым из библиотеки).
:) Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.
Vader
VasCraft
Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.
Не знаю, кого вы там обучаете. Но модель с использованием панелей или wizard'a, имхо, замечательно подходит.
Теория 1 -> Next -> Упражнение 1 -> Next -> Теория 2 ->…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB