Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 5, 2010 10:40:40

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

wxPython TabIndex

Всем привет. Есть форма с несколькими TextCtrl, как правильно назначить порядок смены фокуса по TAB, может есть у кого рабочий пример?



Офлайн

#2 Фев. 5, 2010 11:04:38

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

wxPython TabIndex

http://wiki.wxpython.org/Getting%20Started#How_to_get_tabs_to_work
Вкратце:
1. У окна или панели содержащей контролы должен быть добавлен стиль wx.TAB_TRAVERSAL
2. По умолчанию порядок обхода == порядку создания и добавления на панель
3. Если хотите установить явно у каждого наследника wxWindow есть методы MoveAfterInTabOrder и MoveBeforeInTabOrder



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Фев. 5, 2010 11:40:41

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

wxPython TabIndex

Спасибо! То что нужно.



Офлайн

#4 Фев. 6, 2010 11:24:44

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

wxPython TabIndex

Установил wx.TAB_TRAVERSAL, но переходы всё равно не работают, вот код, в чём может быть ошибка?

# -*- coding: utf-8 -*-
import wx

class newPeopleFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL
wx.Frame.__init__(self, *args, **kwds)

self.lblSurName = wx.StaticText(self, -1, u"Фамилия")
self.lblFirstName = wx.StaticText(self, -1, u"Имя")
self.lblPatName = wx.StaticText(self, -1, u"Отчество")
self.lblBirthDay = wx.StaticText(self, -1, u"Дата рождения")
self.lblAddress = wx.StaticText(self, -1, u"Адрес")
self.lblTel = wx.StaticText(self, -1, u"Тел.")
self.lblFioMather = wx.StaticText(self, -1, u"Ф.И.О матери")
self.lblPlaceWork = wx.StaticText(self, -1, u"Место работы")

self.edtSurName = wx.TextCtrl(self, -1, "")
self.edtFirstName = wx.TextCtrl(self, -1, "")
self.edtPatName = wx.TextCtrl(self, -1, "")
self.edtBirthDay = wx.TextCtrl(self, -1, "")
self.edtAddress = wx.TextCtrl(self, -1, "")
self.edtTel = wx.TextCtrl(self, -1, "")
self.edtFioMather = wx.TextCtrl(self, -1, "")
self.edtPlaceWork = wx.TextCtrl(self, -1, "")

self.__set_properties()
self.__do_layout()

def __set_properties(self):
self.SetTitle(u"Новый")
self.SetSize((500, 400))

def __do_layout(self):
grid_sizer = wx.FlexGridSizer(8, 2, 5, 0)
grid_sizer.Add(self.lblSurName, 0, wx.EXPAND)
grid_sizer.Add(self.edtSurName, 0, wx.EXPAND)
grid_sizer.Add(self.lblFirstName, 0, wx.EXPAND)
grid_sizer.Add(self.edtFirstName, 0, wx.EXPAND)
grid_sizer.Add(self.lblPatName, 0, wx.EXPAND)
grid_sizer.Add(self.edtPatName, 0, wx.EXPAND)
grid_sizer.Add(self.lblBirthDay, 0, wx.EXPAND)
grid_sizer.Add(self.edtBirthDay, 0, wx.EXPAND)
grid_sizer.Add(self.lblAddress, 0, wx.EXPAND)
grid_sizer.Add(self.edtAddress, 0, wx.EXPAND)
grid_sizer.Add(self.lblTel, 0, wx.EXPAND)
grid_sizer.Add(self.edtTel, 0, wx.EXPAND)
grid_sizer.Add(self.lblFioMather, 0, wx.EXPAND)
grid_sizer.Add(self.edtFioMather, 0, wx.EXPAND)
grid_sizer.Add(self.lblPlaceWork, 0, wx.EXPAND)
grid_sizer.Add(self.edtPlaceWork, 0, wx.EXPAND)
grid_sizer.AddGrowableCol(1)

self.SetSizer(grid_sizer)
self.Layout()

if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_2 = newPeopleFrame(None, -1, "")
app.SetTopWindow(frame_2)
frame_2.Show()
app.MainLoop()



Офлайн

#5 Фев. 6, 2010 15:19:09

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

wxPython TabIndex

Какая версия wx и ОС? У меня все работает



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Фев. 6, 2010 15:38:10

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

wxPython TabIndex

Тестировал в:

1) Ubuntu 9.10 (32 bit) + Python 2.6.4 + wxPython 2.8.10.1 (msw-unicode)
2) Windows 7 (32 bit) + Python 2.6.4 + wxPython 2.8.10.1 (unicode)
3) Alt Linux 4.1 (32 bit) + Python 2.5.4 + wxPython 2.8.6

Нигде не работает.



Офлайн

#7 Фев. 6, 2010 18:15:20

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

wxPython TabIndex

Извиняюсь ошибся, предыдущий пример работает в windows 7, а в Linux нет.
Ещё возникла другая проблема, если заменить один TextCtrl на masked.TextCtrl, то и в винде курсор начинает останавливаться на edtBirthDay

# -*- coding: utf-8 -*-
import wx
import wx.lib.masked.textctrl as masked

class newPeopleFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)

self.lblSurName = wx.StaticText(self, -1, u"Фамилия")
self.lblFirstName = wx.StaticText(self, -1, u"Имя")
self.lblPatName = wx.StaticText(self, -1, u"Отчество")
self.lblBirthDay = wx.StaticText(self, -1, u"Дата рождения")
self.lblAddress = wx.StaticText(self, -1, u"Адрес")
self.lblTel = wx.StaticText(self, -1, u"Тел.")
self.lblFioMather = wx.StaticText(self, -1, u"Ф.И.О матери")
self.lblPlaceWork = wx.StaticText(self, -1, u"Место работы")

self.edtSurName = wx.TextCtrl(self, -1, "")
self.edtFirstName = wx.TextCtrl(self, -1, "")
self.edtPatName = wx.TextCtrl(self, -1, "")
self.edtBirthDay = masked.TextCtrl(self, -1, " . . ",
(-1, -1), (100, 24))
self.edtAddress = wx.TextCtrl(self, -1, "")
self.edtTel = wx.TextCtrl(self, -1, "")
self.edtFioMather = wx.TextCtrl(self, -1, "")
self.edtPlaceWork = wx.TextCtrl(self, -1, "")

self.__set_properties()
self.__do_layout()

def __set_properties(self):
self.SetTitle(u"Новый")
self.SetSize((500, 400))
self.edtBirthDay.SetMask("##.##.####")
self.edtBirthDay.SetDatestyle("DMY")

def __do_layout(self):
grid_sizer = wx.FlexGridSizer(8, 2, 5, 0)
grid_sizer.Add(self.lblSurName, 0, wx.EXPAND)
grid_sizer.Add(self.edtSurName, 0, wx.EXPAND)
grid_sizer.Add(self.lblFirstName, 0, wx.EXPAND)
grid_sizer.Add(self.edtFirstName, 0, wx.EXPAND)
grid_sizer.Add(self.lblPatName, 0, wx.EXPAND)
grid_sizer.Add(self.edtPatName, 0, wx.EXPAND)
grid_sizer.Add(self.lblBirthDay, 0, wx.EXPAND)
grid_sizer.Add(self.edtBirthDay, 0)
grid_sizer.Add(self.lblAddress, 0, wx.EXPAND)
grid_sizer.Add(self.edtAddress, 0, wx.EXPAND)
grid_sizer.Add(self.lblTel, 0, wx.EXPAND)
grid_sizer.Add(self.edtTel, 0, wx.EXPAND)
grid_sizer.Add(self.lblFioMather, 0, wx.EXPAND)
grid_sizer.Add(self.edtFioMather, 0, wx.EXPAND)
grid_sizer.Add(self.lblPlaceWork, 0, wx.EXPAND)
grid_sizer.Add(self.edtPlaceWork, 0, wx.EXPAND)
grid_sizer.AddGrowableCol(1)

self.SetSizer(grid_sizer)
self.Layout()

if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_2 = newPeopleFrame(None, -1, "")
app.SetTopWindow(frame_2)
frame_2.Show()
app.MainLoop()



Офлайн

#8 Фев. 8, 2010 08:17:38

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

wxPython TabIndex

magnet85
Извиняюсь ошибся, предыдущий пример работает в windows 7, а в Linux нет.
Ещё возникла другая проблема, если заменить один TextCtrl на masked.TextCtrl, то и в винде курсор начинает останавливаться на edtBirthDay
Попробовал, да действительно под wxGTK есть такой глючок. Используйте вместо wx.Frame - wx.Dialog или поместите контролы на wx.Panel а уж ее на фрейм.

По второй проблеме ничего не скажу, у меня не повторяется.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version