2011-01-22 5 views
0

wxNotebook을 사용해 보려는 샘플 코드를 만들었지 만 새로 삽입 된 페이지는 완전히 비어 있습니다. 타이머 나 새 스레드를 사용하지 않고 MainLoop 앞에 페이지를 삽입하면 작동합니다. 어디서나 업데이트, 새로 고침 등의 작업이 필요하다고 생각되지만 작동하지 않습니다. 필자는 Windows 7과 Python 2.7을 사용합니다.새로운 wxNotebook-wxPython에서 페이지가 비어 있습니다.

import random 
import wx 

######################################################################## 
class TabPanel(wx.Panel): 
    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """""" 
     wx.Panel.__init__(self, parent=parent) 

     colors = ["red", "blue", "gray", "yellow", "green"] 
     self.SetBackgroundColour(random.choice(colors)) 

     btn = wx.Button(self, label="Press Me") 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(btn, 0, wx.ALL, 10) 
     self.SetSizer(sizer) 

######################################################################## 
class DemoFrame(wx.Frame): 
    """ 
    Frame that holds all other widgets 
    """ 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "self.notebook Tutorial", 
          size=(600,400) 
         ) 
     panel = wx.Panel(self) 
     self.tabNum = 3 

     self.notebook = wx.Notebook(panel) 
     tabOne = TabPanel(self.notebook) 
     self.notebook.AddPage(tabOne, "Tab 1") 

     tabTwo = TabPanel(self.notebook) 
     self.notebook.AddPage(tabTwo, "Tab 2") 
     btn = wx.Button(panel, label="Add Page") 
     btn.Bind(wx.EVT_BUTTON, self.onButton) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5) 
     sizer.Add(btn, 0, wx.ALL, 5) 

     panel.SetSizer(sizer) 
     self.Layout() 

     self.Show() 

    #---------------------------------------------------------------------- 
    def onButton(self, event): 
     """""" 
     tab = TabPanel(self.notebook) 
     self.notebook.AddPage(tab, "Tab %s" % self.tabNum) 
     self.tabNum += 1 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = DemoFrame() 
    app.MainLoop() 

답변

2

이것은 스레딩 문제가 아닌 노트북 문제가 나타납니다 : 내가 여기 당신을 도울 또는하지 않을 경우 모르겠지만

import wx 
import threading 

class addNewPages(threading.Thread): 
    def __init__(self, nb): 
     super(addNewPages, self).__init__() 
     self.nb = nb 
    def run(self): 
     self.p = 1 
     for i in range(1, 5, 1): 
      threading.Timer(i, self.adp).start() 
    def adp(self): 
     self.newpage = Page(self.nb) 
     self.newpage.SetBackgroundColour(wx.GREEN) 
     wx.StaticText(self.newpage, -1, "PAGE "+str(self.p), style=wx.ALIGN_CENTRE) 
     wx.CallAfter(self.nb.AddPage, self.newpage, "Page "+str(self.p)) 
     self.p += 1 

class Page(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     wx.StaticText(self, -1, "This is a Page object", (20,20)) 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Notebook Test") 
     p = wx.Panel(self) 
     self.nb = wx.Notebook(p) 
     self.page1 = Page(self.nb) 

     sizer = wx.BoxSizer() 
     sizer.Add(self.nb, 1, wx.EXPAND) 
     p.SetSizer(sizer) 

if __name__ == "__main__": 
    app = wx.App() 
    mf = MainFrame() 
    mf.Show() 
    mf.nb.AddPage(mf.page1, "Testseite 1") 
    th = addNewPages(mf.nb) 
    th.start() 
    app.MainLoop() 
+0

나는 그 페이지를 스레드로만 추가하고 싶습니다. 그 스레드 문제는 무엇입니까? –

1

바보 데모입니다. 다음과 같이 코드를 수정하면 원하는 양식이 만들어집니다. 내 생각에이 문제는 범위 문제이지만 확실하지는 않습니다.

import wx 

def run(nb): 
    for i in range(1, 5, 1): 
     adp(nb, i) 

def adp(nb, p): 
    newpage = Page(nb) 
    newpage.SetBackgroundColour(wx.GREEN) 
    wx.StaticText(newpage, -1, "PAGE "+str(p), style=wx.ALIGN_CENTRE) 
    wx.CallAfter(nb.AddPage, newpage, "Page "+str(p)) 

class Page(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     wx.StaticText(self, -1, "This is a Page object", (20,20)) 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Notebook Test") 
     p = wx.Panel(self) 
     self.nb = wx.Notebook(p) 
     self.page1 = Page(self.nb) 

     sizer = wx.BoxSizer() 
     sizer.Add(self.nb, 1, wx.EXPAND) 
     p.SetSizer(sizer) 

if __name__ == "__main__": 
    app = wx.App() 
    mf = MainFrame() 
    mf.Show() 
    mf.nb.AddPage(mf.page1, "Testseite 1") 
    run(mf.nb) 
    app.MainLoop() 
1

확실히 스레딩 문제가 있습니다. 코드를 실행할 때 우분투에서 얻는 오류를 확인하십시오 :

[email protected]:~/Dropbox/dev/wxfun$ python otherfile.py 
The program 'python' received an X Window System error. 
This probably reflects a bug in the program. 
The error was 'RenderBadPicture (invalid Picture parameter)'. 
    (Details: serial 1066 error_code 161 request_code 149 minor_code 6) 
    (Note to programmers: normally, X errors are reported asynchronously; 
    that is, you will receive the error a while after causing it. 
    To debug your program, run it with the --sync command line 
    option to change this behavior. You can then get a meaningful 
    backtrace from your debugger if you break on the gdk_x_error() function.) 
[email protected]:~/Dropbox/dev/wxfun$ python otherfile.py 
python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.