Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 13, 2010 14:51:05

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython. Замена MDI.

Вступление

Ищу какую-нибудь кроссплатформенную замену MDI. То есть, чтобы пользователь мог одновременно смотреть несколько документов, которые добавил. В wxPython есть свое MDI, но оно работает по назначению только в Windows и имеет ещё некоторые недостатки (проблема с меню на русском, например). Поэтому стал смотреть в сторону aui.

В aui есть связка: AuiMDIParentFrame + AuiMDIChildFrame, но оно тоже не работает как нужно. Например, метод Tile работает некорректно - делит окна не на цело (из трёх окон третье выбросит непонятно куда). И ещё есть некоторые недоразумения с автоматическим упорядочиванием окон.

Ок. Решил обойтись малым - wx.aui.AuiNotebook. Взял пример отсюда:
http://wiki.wxpython.org/AuiNotebook

Всё вроде бы красиво - хочешь используй блокнот, хочешь - вытащи отдельные страницы и смотри вместе. Но тут опять есть некоторые непонятности. Метод Split разделяет окна, но нигде нет упоминания как разделить окна на равные части.

Ну, ладно уж Split, он может и не потребуется, если пользователь сам будет располагать страницы вручную. Но нет чего-то вроде UnSplit. То есть метода, который возвратил бы блокнот в исходное состояние. А вот это уже наверняка может потребоваться.

Пока изобрел велосипед. Делаю UnSplit так: собираю в list ссылки на все окна блокнота и заголовки с помощью GetPage, GetPageText, затем удаляю все страницы по одной с помощью RemovePage и, наконец, вставляю все окна из листа. Работает, но видна работа этого велосипеда, если окон много.

Вопросы:

1. Какую кроссплатформенную замену MDI в wxWidgets можете посоветовать?
2. Есть ли у wx.aui.AuiNotebook какой-нибудь метод, возвращающий его в исходное блокнотное состояние?



Офлайн

#2 Апрель 13, 2010 17:55:21

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

wxPython. Замена MDI.

Честно говоря я ничего не понял что вы хотите. Пока могу посоветовать попробывать Freeze/Thow в главном окне на момент перестройки. Может помочь от миганий.



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

Офлайн

#3 Апрель 13, 2010 19:34:47

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython. Замена MDI.

Я хочу получить многодокументный интерфейс, в котором можно было бы несколько документов просматривать одновременно.

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import wx
import wx.aui
########################################################################
class TabPanel(wx.Panel):
"""
This will be the first notebook tab
"""
#----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
txtOne = wx.TextCtrl(self, wx.ID_ANY, "")
txtTwo = wx.TextCtrl(self, wx.ID_ANY, "")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(txtOne, 0, wx.ALL, 5)
sizer.Add(txtTwo, 0, wx.ALL, 5)
self.SetSizer(sizer)


class DemoPanel(wx.Panel):
"""
This will be the first notebook tab
"""
#----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
# create the AuiNotebook instance
nb = wx.aui.AuiNotebook(self)
# add some pages to the notebook
pages = [(TabPanel(nb), "Tab %i"%(i)) for i in xrange(16) ]
for page, label in pages:
nb.AddPage(page, label)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(nb, 1, wx.EXPAND)
self.SetSizer(sizer)
self.nb = nb

########################################################################
class DemoFrame(wx.Frame):
"""
Frame that holds all other widgets
"""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, wx.ID_ANY,
"AUI-Notebook Tutorial",
size=(600,400))
self.panel = DemoPanel(self)
self.make_menu()

self.Show()

def make_menu(self):
menuBar = wx.MenuBar()
menu = wx.Menu()

items = (("&Notebook View", self.notebook_view), ("&Add Page", self.add_page))

for item in items:
menuItem = menu.Append(-1, item[0])
self.Bind(wx.EVT_MENU, item[1], menuItem)

menuBar.Append(menu, "&File")
self.SetMenuBar(menuBar)

def notebook_view(self, event):
nb = self.panel.nb
pages = []
for i in xrange(nb.GetPageCount()):
pages.append((nb.GetPage(i), nb.GetPageText(i)))
while nb.GetPageCount():
nb.RemovePage(0)
for page in pages:
nb.AddPage(page[0], page[1])

def add_page(self, event):
self.panel.nb.AddPage(TabPanel(self.panel.nb), "New Page")

#----------------------------------------------------------------------
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = DemoFrame()
app.MainLoop()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version