LINUX.ORG.RU

wxPython: динамически создавать и убирать с экрана виджеты


0

0

Подскажите, кто знает, плз.
Мне необходимо динамически создавать и убирать с экрана виджеты.
Пробую нижеприведенный код.


По меню'Add Buttons' все работает правильно только первый раз.
Команда по меню 'Close Buttons' вообще не работает.
'Destroy Buttons'работает всегда.

Последовательно 
   'Add Buttons',
   затем 'Destroy Buttons',
   и снова 'Add Buttons'
- во втором случае получаем одну кнопку вместо 6 и она неактивна.
 
Возможно, так выходит, потому что Sizer != Window.

Как исправить код, чтоб после Destroy()получать полноценные кнопки в нужном количестве?
спасибо

Democode:
------------
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import wx
import os

ID_ADD=100
ID_BUTTON1 = 110
ID_REM = 300
ID_DES = 400
ID_EXIT=200

class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):
        self.dirname=''
        wx.Frame.__init__(self,parent,wx.ID_ANY, title, style=wx.DEFAULT_FRAME_STYLE|
                                        wx.NO_FULL_REPAINT_ON_RESIZE)
        
        self.CreateStatusBar() # A Statusbar in the bottom of the window
        
        # Setting up the menu.
        filemenu= wx.Menu()

        filemenu.Append(ID_ADD, "&Add buttons","")
        filemenu.Append(ID_REM, "&Close buttons","")
        filemenu.Append(ID_DES, "&Destroy buttons","")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT,"E&xit"," Terminate the program")
         
        # Creating the menubar.
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        wx.EVT_MENU(self, ID_ADD, self.OnAdd)
        wx.EVT_MENU(self, ID_EXIT, self.OnExit)
        wx.EVT_MENU(self, ID_REM, self.OnRem)
        wx.EVT_MENU(self, ID_DES, self.OnDes)
        self.Show(1)

    def OnExit(self,e):
        self.Close(True)  # Close the frame.


    def OnRem(self,e):
        for i in range(0,6):
            self.buttons[i].Close(True)

    def OnAdd(self,e):
        #add buttons
        self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        self.buttons=[]
        for i in range(0,6):
            self.buttons.append(wx.Button(self, ID_BUTTON1+i, "Button &"+`i`))
            self.sizer2.Add(self.buttons[i],1,wx.EXPAND)

        # Use some sizers to see layout options
        self.sizer=wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.sizer2,0,wx.EXPAND)

        #Layout sizers
        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)
    def OnDes(self,e):
        for i in range(0,6):
            self.buttons[i].Destroy()


app = wx.PySimpleApp()
frame = MainWindow(None, -1, "Sample editor")
app.MainLoop()
anonymous

Я обычно жедаю так: сразу создаю все нужные элементы, 
засовываю их в сайзеры и просто показываю нужные 
в данный момент. Например:

self.buttonItem1 = self.sizer.Add(self.button1)
self.buttonItem2 = self.sizer.Add(self.button2)

а затем:

self.buttonItem1.Hide()
self.buttonItem2.Show()
self.sizer.Layout()

Работает.

redvasily
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.