2011-08-14 24 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でなんとかないSI。しかし、あなたは、このような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ノートブックを使用することもできます。それはwx.auiのものではなく、agwのlibからのものであることに注意してください。 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()でアクティブなタブを設定できます。しかし、無限ループを回避するためには、イベントをアンバインド/ディスエーブルし、バインド/イネーブルする必要があります。パネルコードにはwx.BeginBusyCursor()、wx.EndBusyCursor()があります。その後、アプリがビジー状態になると、タブの変更は「無効」になります。

+0

私はwx.Listbookで同じ問題を抱えていましたが、aGueguの答えを使用しましたが、SetSelectionとバインドとバインディングの代わりに再帰を避けるため、単純にChangeSelectionを使用しました。 – dhiga

関連する問題