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