Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » wxPython: взаимодействие между формами [RSS Feed]

#1 Апрель 14, 2011 23:06:18

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

Доброго времени суток.
Постановка вопроса такова. Имеется два фрейма, один из них основной, другой дочерний, причем дочерний вызывается по событию из кнопки основного примерно по такой функции

    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
Я понимаю, что искомый модуль не находится, но что делать, пока не понятно.



Офлайн

#2 Апрель 15, 2011 04:57:02

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

VasCraft
но, что при self.Hide(), что при self.Destroy() данные теряются
ну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
Зачем прятать “старшее” окно при показе младшего? Может целесообразнее вместо Show использовать ShowModal?



Офлайн

#3 Апрель 16, 2011 18:31:56

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

pyuser
VasCraft
но, что при self.Hide(), что при self.Destroy() данные теряются
ну это и не удивительно :) Вы же создаете новый объект “старшего” окна.
Зачем прятать “старшее” окно при показе младшего? Может целесообразнее вместо Show использовать ShowModal?
Суть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.



Офлайн

#4 Апрель 16, 2011 19:42:30

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

VasCraft
Суть в том, чтобы пользователь не имел возможности воспользоваться данными “старшего” окна, поэтому и предполагается, что “старшее” будет не просто блокироваться, но и не будет видимо пользователю.
Не могу понять зачем это нужно. Если дочернее окно - модальное, то пользователь не сможет изменить что-то в старшем окне или скопировать что-нибудь из него. Если же вы опасаетесь, что он может какие-то данные перенести из старшего окна в младшее вручную, то он может это сделать и по памяти.
Если уж очень хочется прятать окна, то передавайте в дочернее окно ссылку на объект старшего окна и в методе OnCloseWindow делайте для этого окна Show().
И наконец, если вы все-таки решили остановиться на варианте “прятать/показывать”, то задумайтесть над вариантом исользования нескольких панелей в одном окне, вместо нескольких отдельных окон.



Офлайн

#5 Апрель 16, 2011 20:29:28

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

Vader
Если уж очень хочется прятать окна, то передавайте в дочернее окно ссылку на объект старшего окна и в методе OnCloseWindow делайте для этого окна Show().
Интересный вариант. Если можно, приведите примерный код, как это сделать.

Vader
И наконец, если вы все-таки решили остановиться на варианте “прятать/показывать”, то задумайтесть над вариантом исользования нескольких панелей в одном окне, вместо нескольких отдельных окон.
Не вариант. Что-то типа Notebook однозначно не идет по сути приложения.



Отредактировано (Апрель 16, 2011 20:36:24)

Офлайн

#6 Апрель 16, 2011 21:01:25

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

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

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



Офлайн

#7 Апрель 16, 2011 21:38:27

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

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

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

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

Или более веселый вариант налепливания и раскрытия/сокрытия различных виджетов на панели?



Офлайн

#8 Апрель 16, 2011 22:10:43

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

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

Из-за того, что вы держите в тайне предназначение вашего приложения, трудно что-то советовать. Но судя по тому, что вы пытаетесь сделать, у меня создается впечатление, что это некий wizard, так вот для wizard'a вариант с панелями подходит больше всего (хотя, если это действительно wizard, то лучше воспользоваться уже готовым из библиотеки).



Офлайн

#9 Апрель 16, 2011 22:16:21

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

Vader
Из-за того, что вы держите в тайне предназначение вашего приложения, трудно что-то советовать. Но судя по тому, что вы пытаетесь сделать, у меня создается впечатление, что это некий wizard, так вот для wizard'a вариант с панелями подходит больше всего (хотя, если это действительно wizard, то лучше воспользоваться уже готовым из библиотеки).
:) Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.



Офлайн

#10 Апрель 16, 2011 22:24:44

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython: взаимодействие между формами

VasCraft
Нет, не wizard. Это обучающая программа с модулем проверки знаний обучающегося. Отсюда и весь сыр-бор с доступом форм.
Не знаю, кого вы там обучаете. Но модель с использованием панелей или wizard'a, имхо, замечательно подходит.
Теория 1 -> Next -> Упражнение 1 -> Next -> Теория 2 ->…



Офлайн

  • Начало
  • » GUI
  • » wxPython: взаимодействие между формами[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version