LINUX.ORG.RU

Сайзеры в wxPython

 ,


0

2

Никогда раньше не программировал GUI, а тут вот понадобилось наговнокодить небольшой редактор табличных данных. Непродолжительное гугление привело к выбору wxPython, но вот возникла проблема, при открытии файла создаю закладку на Notebook, на нее сайзер, на него сетку(Grid) с ключом wx.EXPAND. Но сетка не ресайзится по размеру окна, то есть если я запускаю приложение, открываю файл, потом разворачиваю окно на весь экран и сетка остается того же размера что и была. Как сделать так чтоб размер сетки менялся при изменении размеров окна?

import wx
import wx.grid as grid_

class MyFrame(wx.Frame):
    def __init__(self, parent=None, id=wx.ID_ANY, pos=wx.DefaultPosition, title='Editor'):
        wx.Frame.__init__(self, parent, id, title, pos, (600,600))

        # Menu
        menuBar = wx.MenuBar()
        menu = wx.Menu()
        m_eopen = menu.Append(wx.ID_ANY, "&Open file")
        m_exit = menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Close window and exit program.")
        menuBar.Append(menu, "&File")
        self.SetMenuBar(menuBar)
        self.Bind(wx.EVT_MENU, self.OnOpen, m_eopen)
        self.Bind(wx.EVT_MENU, self.OnClose, m_exit)
        # Notebook
        self.notebook = wx.Notebook( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )

    def OnOpen(self, event):
        dirname = " "
        dlg = wx.FileDialog(self, "Choose a file to open", dirname, " ", "*.*", wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            filename = dlg.GetFilename()
            dirname = dlg.GetDirectory()

            # Create new tab
            tab_panel = wx.Panel( self.notebook, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
            self.notebook.AddPage( tab_panel, filename, False )
            extract_tab = wx.Panel( tab_panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )

            # Create Grid
            data_grid = grid_.Grid( tab_panel, wx.ID_ANY, wx.DefaultPosition, tab_panel.GetSize(), wx.HSCROLL|wx.VSCROLL )
            data_grid.CreateGrid( 5, 100)


            grid_sizer = wx.BoxSizer( wx.HORIZONTAL )
            grid_sizer.Add(data_grid, 1 , wx.EXPAND |wx.ALL)
            grid_sizer.FitInside(extract_tab)
            extract_tab.SetSizer(grid_sizer)
            extract_tab.Layout()

    def OnClose(self, event):
        dlg = wx.MessageDialog(self,
            "Do you really want to close this application?",
            "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
        if dlg.ShowModal() == wx.ID_OK:
            self.Destroy()

С сайзером всё правильно сделано. В твоем случае просто вместо wx.Notebook проще будет wx.aui.AuiNotebook использовать, телодвижений меньше.

У меня ресайзится всё автоматом при изменении окна.

import wx
import wx.aui
import wx.grid as grid_

class MyFrame(wx.Frame):
    def __init__(self, parent=None, id=wx.ID_ANY, pos=wx.DefaultPosition, title='Editor'):
        wx.Frame.__init__(self, parent, id, title, pos, (600,600))

        # Menu
        menuBar = wx.MenuBar()
        menu = wx.Menu()
        m_eopen = menu.Append(wx.ID_ANY, "&Open file")
        m_exit = menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Close window and exit program.")
        menuBar.Append(menu, "&File")
        self.SetMenuBar(menuBar)
        self.Bind(wx.EVT_MENU, self.OnOpen, m_eopen)
        self.Bind(wx.EVT_MENU, self.OnClose, m_exit)
        # Notebook
        self.notebook = wx.aui.AuiNotebook(self, wx.ID_ANY, 
                                           style=wx.aui.AUI_NB_DEFAULT_STYLE)

    def OnOpen(self, event):
        dirname = " "
        dlg = wx.FileDialog(self, "Choose a file to open", dirname, " ", "*.*", wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            filename = dlg.GetFilename()
            dirname = dlg.GetDirectory()

            # Create new tab
            tab_panel = wx.Panel( self.notebook, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
            

            # Create Grid
            data_grid = grid_.Grid( tab_panel, wx.ID_ANY, wx.DefaultPosition, tab_panel.GetSize(), wx.HSCROLL|wx.VSCROLL )
            data_grid.CreateGrid( 5, 100)


            grid_sizer = wx.BoxSizer( wx.HORIZONTAL )
            grid_sizer.Add(data_grid, 1 , wx.EXPAND |wx.ALL)
            
            tab_panel.SetSizer(grid_sizer)
            self.notebook.InsertPage(0, tab_panel, filename, True)

    def OnClose(self, event):
        dlg = wx.MessageDialog(self,
            "Do you really want to close this application?",
            "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
        if dlg.ShowModal() == wx.ID_OK:
            self.Destroy()
            
app = wx.App()
MyFrame(None).Show()
app.MainLoop()
xxblx ★★★
()
Последнее исправление: xxblx (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.