2011-08-14 14 views
5

Czy mimo to można wyłączyć kartę notatnika? Jak możesz z widżetami? Mam długi proces, który rozpoczynam, i chociaż powinno to być całkiem zrozumiałe dla osób, które na niego patrzą, chcę móc uniemożliwić użytkownikowi mucking around w innych zakładkach, dopóki proces, który jest uruchomiony nie zostanie zakończony.wxPython: Czy wyłączyć zakładkę notatnika?

Nie mogę znaleźć niczego w wx.Notebook, aby pomóc w tym?

Fragment kodu:

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") 

Odpowiedz

3

To Si nie wykonalne z wx.Notebook. Ale można korzystać z niektórych bardziej zaawansowanych widżetów, takich jak 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

Czy działa, ale stylistycznie, stwarza dla mnie inne problemy ('aui.AuiNotebook' oraz' wx.FlatNotebook'). Trzymanie się zwykłego starego wx.Notebook na końcu. W każdym razie dzięki. – chow

2

Technicznie wx.Notebook nie ma sposobu, aby wyłączyć kartę. Możesz jednak zrobić to samo, sprawdzając, która zakładka jest kliknięta i czy jest "wyłączona", zawetuj EVT_NOTEBOOK_PAGE_CHANGING lub EVT_NOTEBOOK_PAGE_CHANGED wydarzenie. Alternatywnie można używać notebooka AUI, jak wspomniano powyżej. Zauważ, że to ten z agw lib, a nie z pliku wx.aui. FlatNotebook zapewnia również możliwość wyłączania kart. Zobacz przykładowy demo 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) 

aktywnej karty można ustawić Notebook.SetSelection(). Ale zdarzenie powinno być odłączone/wyłączone i powiązać/włączyć wokół niego, aby uniknąć w nieskończonej pętli. Powinny istnieć wx.BeginBusyCursor(), wx.EndBusyCursor() w kodach panelowych. Następnie zmiana karty jest "wyłączona", gdy aplikacja jest zajęta.

+0

Miałem ten sam problem z wx.Listbook i użyłem odpowiedzi aGuegu, ale w celu uniknięcia rekursji, zamiast SetSelection i unbinding i bindowania, wykorzystano proste narzędzie ChangeSelection, które nie generuje zdarzeń zmiany strony. – dhiga