Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с фреймами и функциями 
V
    Опции темы
proDiva
  Дата 19.9.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Везде в источниках описан вызов функции, но нигде нет описания, как внутри функции обратиться к элементу формы (фрейма). Например, нужно чтобы при нажатии кнопки формы менялось значение поля формы. Пытаюсь сделать так, но пишет, что у MyFrame нет аргумента t1. Подскажите, пожалуйста, чего не хватает.
Код

class MyFrame(wx.Frame):
   ....
   panel=wx.Panel(self)
   t1=wx.TextCtrl(panel)
   ....

   def OnLoad(self, evt):
        self.t1.SetValue("15")


Это сообщение отредактировал(а) proDiva - 19.9.2006, 17:13
PM MAIL ICQ   Вверх
setq
Дата 19.9.2006, 19:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Потому что в конструкторе надо писать self.t1=wx.TextCtrl(panel)
  Вверх
proDiva
Дата 19.9.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Я так и знала! В смысле, что упускаю какую-то мелочь))) Спасибо большое, из-за такого пустяка затормозилась громадная программа smile ))) Теперь все пойдет отлично smile 
PM MAIL ICQ   Вверх
proDiva
Дата 2.11.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Еще одна проблема с теми же фреймами. Ситуация такая: на одном фрейме кнопка, событие вызывает другой фрейм, на котором еще одна кнопка. Так вот событие последней кнопки должно возвращать значение переменной в поле первого фрейма. Т.е. значение tmp должно вписаться в поле self.mroj. Что нужно дописать?
Код

class FrameFiz(wx.Frame):
    #создание формы
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(150, 50), size=(350, 520))
        
        panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)
        ....
        l_mroj = wx.StaticText(panel, -1, "Место рожд.", (10, 120), size=(80, 20))
        self.mroj = wx.TextCtrl(panel, -1, "", (100, 120), size=(230, 20), style=wx.TE_MULTILINE)
        ....
        btn_adr = wx.Button(panel, -1, "Ввести адрес", (100, 142), size=(100, 20))
        self.Bind(wx.EVT_BUTTON, self.OnButtonAdr, btn_adr)
        .......
    def OnButtonAdr(self, evt):
        frame=FrameAdres(None, 'Ввод адреса по формату')
        frame.Show(True)

....

class FrameAdres(wx.Frame):
    #создание формы
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(250, 100), size=(600, 300))
        
        panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)

        l_ind = wx.StaticText(panel, -1, "Индекс", (10, 10), size=(80, 20))
        self.ind = wx.TextCtrl(panel, -1, "", (100, 10), size=(100, 20))

        l_reg = wx.StaticText(panel, -1, "Регион", (10, 32), size=(80, 20))
        self.reg = wx.TextCtrl(panel, -1, "", (100, 32), size=(250, 20))

        btn_ok = wx.Button(panel, -1, "ОК", (20, 240))
        self.Bind(wx.EVT_BUTTON, self.OnButtonOk, btn_ok)

    def OnButtonOk(self, evt):
        tmp=self.ind.GetValue()+','+self.reg.GetValue()
        self.Destroy()


PM MAIL ICQ   Вверх
ser_gen
Дата 2.11.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 25.9.2006

Репутация: 1
Всего: 1



По моему можно так:
Код

def OnButtonOk(self, evt):
        self.tmp=self.ind.GetValue()+','+self.reg.GetValue()
        self.Destroy()


А потом в обработцике нажатия в первой форме забрать это значение
Код

 def OnButtonAdr(self, evt):
        frame=FrameAdres(None, 'Ввод адреса по формату')
        frame.Show(True)
        print  frame.tmp

PM MAIL   Вверх
proDiva
Дата 2.11.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Не срабатывает, так я уже пробовала. Пишет, что у FrameAdres нет атрибута tmp.
PM MAIL ICQ   Вверх
setq
Дата 4.11.2006, 15:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я не wx-хакер и не знаю как это правильно должно делаться, но есть 2 плохие идеи: передать первый фрейм в конструктор другого фрейма и использовать глобальную переменную. Но теоретически наверно ещё возможно постить во втором фрейме событие, которое будет ловить первый фрейм.
  Вверх
proDiva
Дата 8.11.2006, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(setq @  4.11.2006,  15:25 Найти цитируемый пост)
Но теоретически наверно ещё возможно постить во втором фрейме событие, которое будет ловить первый фрейм. 

Пыталась и так. Пока не переборола.
PM MAIL ICQ   Вверх
_Viper_
Дата 8.11.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



Цитата
Не срабатывает, так я уже пробовала. Пишет, что у FrameAdres нет атрибута tmp.


Не срабатывает, потому что этот атрибут создаёться, только после того как пользователь нажмёт на ОК. А использовать ты его пытаешься сразу после вывода фрейма.

Самое простое, пожалуй, это наследовать FrameAdres не от wx.Frame, а от wx.Dialog и использовать ShowModal вместо Show. Тогда выполнение продолжиться только после закрытия FrameAdres.
PM MAIL   Вверх
proDiva
Дата 9.11.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(_Viper_ @  8.11.2006,  18:25 Найти цитируемый пост)
Самое простое, пожалуй, это наследовать FrameAdres не от wx.Frame, а от wx.Dialog и использовать ShowModal вместо Show. Тогда выполнение продолжиться только после закрытия FrameAdres. 

Это я пыталась сделать в первую очередь, я имею в виду диалог. Но проблема упирается в то, что у меня должно быть в диалоге с десяток полей, а результатом должна быть строка из данных со всех этих полей. Это реализовать тоже не получилось.
PM MAIL ICQ   Вверх
_Viper_
Дата 9.11.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



Цитата(proDiva @  9.11.2006,  09:13 Найти цитируемый пост)
Но проблема упирается в то, что у меня должно быть в диалоге с десяток полей, а результатом должна быть строка из данных со всех этих полей.

Правильно, диалог возвращает на какую кнопку нажал юзер, а значения полей надо получать через атрибуты этого диалога.

Вот примерчик, надеюсь что поможет  smile :

Код
import wx
class SubclassDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self, None, -1, 'Dialog Subclass',
                            size=(300, 125))
        okButton = wx.Button(self, wx.ID_OK, "OK", pos=(15, 60))
        okButton.SetDefault()
        cancelButton = wx.Button(self, wx.ID_CANCEL, "Cancel",
        pos=(115, 60))
        self.ind = wx.TextCtrl(self, -1, "Text 1", (15, 10), size=(100, 20))
        self.reg = wx.TextCtrl(self, -1, "Text 2", (15, 32), size=(250, 20))

if __name__ == '__main__':
    app = wx.PySimpleApp()
    dialog = SubclassDialog()
    result = dialog.ShowModal()
    if result == wx.ID_OK:
        print "OK"
        print dialog.ind.GetValue()
        print dialog.reg.GetValue()
    else:
        print "Cancel"
    dialog.Destroy()

PM MAIL   Вверх
proDiva
Дата 9.11.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



_Viper_,  как раз то, что мне нужно. Спасибо!
PM MAIL ICQ   Вверх
_Viper_
Дата 9.11.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



proDiva, пожалуйста. Рад, что смог помочь.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.