Форум сайта python.su
Доброго времени суток.
Постановка вопроса такова. Имеется два фрейма, один из них основной, другой дочерний, причем дочерний вызывается по событию из кнопки основного примерно по такой функции
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()
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
Офлайн
VasCraftну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
но, что при self.Hide(), что при self.Destroy() данные теряются
Офлайн
pyuserСуть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.VasCraftну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
но, что при self.Hide(), что при self.Destroy() данные теряются
Зачем прятать “старшее” окно при показе младшего? Может целесообразнее вместо Show использовать ShowModal?
Офлайн
VasCraftНе могу понять зачем это нужно. Если дочернее окно - модальное, то пользователь не сможет изменить что-то в старшем окне или скопировать что-нибудь из него. Если же вы опасаетесь, что он может какие-то данные перенести из старшего окна в младшее вручную, то он может это сделать и по памяти.
Суть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.
Офлайн
VaderИнтересный вариант. Если можно, приведите примерный код, как это сделать.
Если уж очень хочется прятать окна, то передавайте в дочернее окно ссылку на объект старшего окна и в методе OnCloseWindow делайте для этого окна Show().
VaderНе вариант. Что-то типа Notebook однозначно не идет по сути приложения.
И наконец, если вы все-таки решили остановиться на варианте “прятать/показывать”, то задумайтесть над вариантом исользования нескольких панелей в одном окне, вместо нескольких отдельных окон.
Отредактировано (Апрель 16, 2011 20:36:24)
Офлайн
VasCraftНу со сылкой я погорячился, забыл, что у окон тоже есть свойство Parent, так что при создании дочернего окна делате так
Интересный вариант. Если можно, приведите примерный код, как это сделать.
window1 = testframe(self, wx.ID_ANY)
self.Hide()
self.Parent.Show()
self.Destroy()
VasCraftNotebook не нужен. Просто Panel.
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.
Офлайн
VaderСпасибо, помогло! :)VasCraftНу со сылкой я погорячился, забыл, что у окон тоже есть свойство Parent, так что при создании дочернего окна делате так
Интересный вариант. Если можно, приведите примерный код, как это сделать.а в методе OnCloseWindow этого дочернего окна так:window1 = testframe(self, wx.ID_ANY)
self.Hide()self.Parent.Show()
self.Destroy()
Vader:) Насчет пользователей и проклятия можно поподробнее? :)
Но, еще раз повторяю, не делайте так. Пользователи вас проклянут :)
Хотя, может у вас мега-супер уникальная задача, тогда конечно извращайтесь на здоровье.
VaderА вот тут непонятно. Вы предлагаете загонять несколько различных панелей друг на друга, а в качестве родителя каждой назначать сам фрейм приложения, а в процессе различных манипуляций скрывать/показывать их.VasCraftNotebook не нужен. Просто Panel.
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.
И почему не подходит? Исходя из того, что вы написали, мне этот вариант кажется более правильным.
Офлайн
VasCraftЕсли коротко, то вы, видимо, пытаетесь изобрести велосипед, а пользователи велосипедов не любят. Исчезающие в никуда и появляющиеся из ниоткуда окна, вызывают, как минимум, недоумение, и очень часто просто раздражают.
Насчет пользователей и проклятия можно поподробнее?
VasCraftДа, именно так. Создаете нужно количество панелей из которых видимой в каждый момент времени является только одна, по мере необходимости добавляете/убираете их из сайзера родительского окна. У этого способа, множество преимуществ перед тем, что вы пытаетесь сделать:
А вот тут непонятно. Вы предлагаете загонять несколько различных панелей друг на друга, а в качестве родителя каждой назначать сам фрейм приложения, а в процессе различных манипуляций скрывать/показывать их.
Офлайн
Vader:) Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.
Из-за того, что вы держите в тайне предназначение вашего приложения, трудно что-то советовать. Но судя по тому, что вы пытаетесь сделать, у меня создается впечатление, что это некий wizard, так вот для wizard'a вариант с панелями подходит больше всего (хотя, если это действительно wizard, то лучше воспользоваться уже готовым из библиотеки).
Офлайн
VasCraftНе знаю, кого вы там обучаете. Но модель с использованием панелей или wizard'a, имхо, замечательно подходит.
Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.
Офлайн