2011-08-14 3 views
5

Можно ли отключить вкладку для ноутбука? Как вы можете сами виджеты? У меня долгий процесс, который я запускаю, и хотя он должен быть довольно понятным для тех, кто смотрит на него, я хочу, чтобы пользователь не мог нажимать на другие вкладки до тех пор, пока процесс, который он запускает, не будет завершен.wxPython: отключить вкладку для ноутбука?

Возможно, я ничего не нашел в wx.Notebook, чтобы помочь с этим?

Фрагмент кода:

def __init__(self, parent): 
    wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT) 

    self.AddPage(launchTab.LaunchPanel(self), "Launch") 
    self.AddPage(scanTab.ScanPanel(self), "Scan") 
    self.AddPage(extractTab.ExtractPanel(self), "Extract") 
    self.AddPage(virtualsTab.VirtualsPanel(self), "Virtuals") 

ответ

3

Это си не выполнимо с wx.Notebook. Но вы можете использовать некоторые из более продвинутых виджетов, таких как wx.lib.agw.aui.AuiNotebook:

import wx 
import wx.lib.agw.aui as aui 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     style = aui.AUI_NB_DEFAULT_STYLE^aui.AUI_NB_CLOSE_ON_ACTIVE_TAB 
     self.notebook = aui.AuiNotebook(self, agwStyle=style)  

     self.panel1 = wx.Panel(self.notebook) 
     self.panel2 = wx.Panel(self.notebook) 
     self.panel3 = wx.Panel(self.notebook) 

     self.notebook.AddPage(self.panel1, "First") 
     self.notebook.AddPage(self.panel2, "Second") 
     self.notebook.AddPage(self.panel3, "Third") 

     self.notebook.EnableTab(1, False) 

     self.Show() 


app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
+0

Работает ли, но стилистически, создает для меня другие проблемы («aui.AuiNotebook» и «wx.FlatNotebook»). В конце концов, придерживайтесь обычного старого wx.Notebook. Спасибо хоть. – chow

2

Технически wx.Notebook не есть способ отключить вкладку. Тем не менее, вы можете сделать то же самое, проверив, какая вкладка нажата, и если она «отключена», наложите вето на событие EVT_NOTEBOOK_PAGE_CHANGING или EVT_NOTEBOOK_PAGE_CHANGED. В качестве альтернативы вы можете использовать ноутбук AUI, как указано выше. Обратите внимание, что это таковая из agw lib, а не из wx.aui. FlatNotebook также обеспечивает возможность отключения вкладок. См. Демонстрацию wxPython для примера.

0
class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     p = wx.Panel(self) 
     self.nb = wx.Notebook(p) 
     ...... 

     self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged) 

    def OnPageChanged(self, event): 
     if wx.IsBusy(): 
      self.Unbind(wx.EVT_NOTEBOOK_PAGE_CHANGED) 
      self.nb.SetSelection(event.GetOldSelection()) 
      self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged) 

Активная вкладка может быть установлена ​​Notebook.SetSelection(). Но это событие должно быть unbinded/disable и bind/enable вокруг него, чтобы избежать бесконечного цикла. В панельных кодах должен быть wx.BeginBusyCursor(), wx.EndBusyCursor(). Затем изменение вкладки «отключено», когда приложение занято.

+0

У меня была такая же проблема с wx.Listbook, и я использовал ответ aGuegu, но чтобы избежать рекурсии, вместо SetSelection и unbinding и binding, просто используемый ChangeSelection, который не генерирует события изменения страницы. – dhiga

Смежные вопросы