2012-10-05 83 views
2

我一直在使用我的Python程序時遇到了一些麻煩。基本上,它是一個非常非常簡單的文件管理器。按鈕上的wxpython刷新窗口按

我一直在試圖讓它在文件夾之間移動(用戶單擊一個文件夾,程序刷新顯示並顯示文件夾的內容)。

我遇到的問題是,我似乎無法得到按鈕刷新顯示,然後單擊時用新文件夾和文件填充它。

這是我使用的代碼,它在Linux上。

import wx 
import fileBrowser 

class interface(wx.Frame): 

    def __init__(self, parent, id): 
     '''(object, int) --> None 
     Set up wx python in a frame and displays it and contents defined in this function on the screen.''' 

     wx.Frame.__init__(self, parent, id, "Bronto", size = (800, 600)) 
     panel = wx.Panel(self) 
     self.createPanels() 
     contents = fileBrowser.print_items("/") 
     wx.StaticText(panel, -1, "/", (50, 10)) 
     col = 50 
     row = 50 
     for items in contents: 
      name  = items 
      col, row = self.makeIcons(panel, (800, 600), name, col, row) 

    def makeIcons(self, panel, param, name, col, row): 
     '''(object, object) --> None 
     Place a button on the window that uses an image as its icon.''' 

     pic = wx.Image("folder.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap() 
     self.button = wx.BitmapButton(panel, -1, pic, pos = (col, row)) 
     wx.StaticText(panel, -1, name, (col + 10, row + 40)) 
     self.Bind(wx.EVT_BUTTON, self.displayContents, self.button) 
     self.button.SetDefault() 

     if(col < 600): 
      return col + 90, row 
     else: 
      col = 50 
      return col, row + 80 


    def createPanels(self): 
     '''(object) --> None 
     Create and place both menu and status bars on the window.''' 

     status  = self.CreateStatusBar() 
     menubar = wx.MenuBar() 
     File  = wx.Menu() 
     Edit  = wx.Menu() 

     menubar.Append(File,"File") 
     menubar.Append(Edit, "Edit") 
     new = wx.MenuItem(File, 101, '&New\tCtrl+N', 'Creates a new document') 
     File.AppendItem(new) 
     self.Bind(wx.EVT_MENU, self.NewApplication, id=101) 
     self.SetMenuBar(menubar) 


    def NewApplication(self, event): 
     app = wx.PySimpleApp() 
     frame = interface(parent = None, id =1) 

     frame.Show() 
     app.MainLoop() 


    def displayContents(self, event): 
     '''(event) --> None 
     Display the contents of the folder clicked on''' 



     #self.panel.Destroy(); 
     #self.panel = wx.Panel(self) 
     self.Refresh(True) 
     contents = fileBrowser.print_items("/home") 
     col = 50 
     row = 50 
     for items in contents: 
      name  = items 
      wx.Yield() 
      col, row = self.makeIcons(panel, (800, 600), name, col, row) 

if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = interface(parent = None, id =1) 

    frame.Show() 
    app.MainLoop() 

這裏是fileBrower程序(目前我只看到文件夾,但以後我會改變它)

import os 
import os.path 

def print_items(d): 
    '''(str) -> NoneType 
    Print the list of files and directories in directory d, recursively, 
    prefixing each with indentation.''' 

    icons = [] 
    #print out the names of files and subdirectories 
    for filename in os.listdir(d): 
     subitem = os.path.join(d, filename) 
     if os.path.isdir(subitem): 
      print filename 
      icons.append(filename) 

    return icons 

@pthonm:我加你建議的代碼,但它似乎不用新的東西更新它(它確實清除了窗口)

編輯:好吧,我幾乎有它的工作。我可以通過使用self.Refresh(True)來顯示內容,但只有在不使用self.panel.Destroy()方法時才能使用。所以,關於如何擺脫按鈕和文本的任何建議(請參閱我添加的displayContents方法)?

編輯2:我得到它的工作。我所做的是,我將其添加到我的displayContents方法。這可能不是這樣做的最好方法。

def displayContents(self, event): 
    '''(event) --> None 
    Display the contents of the folder clicked on''' 

    self.panel.Destroy(); 
    self.panel = wx.Panel(self) 
    self.createPanels() 
    self.Update() 
    wx.StaticText(self.panel, -1, location, (50, 10)) 
    contents = fileBrowser.print_items("/home/gum/Documents") 
    col = 50 
    row = 50 
    for directory,name in contents.iteritems(): 
     col, row = self.makeIcons(self.panel, (800, 600), name, col, row) 
+0

你想這麼簡單的文件管理器很困難和複雜。現有的設計模式及其對您更好,根據規則進行編程。這裏是一個代碼示例,如何編寫一個文件管理器。 「http://zetcode.com/wxpython/skeletons/」研究這段代碼並從頭開始寫。我對你的建議..! – fecub

回答

1

我認爲問題是,你

  • 爲每個文件夾
  • 不要刪除舊板

我建議你保存舊創建新的面板面板在self.panel處,每次撥打self.panel.Destroy();self.panel = wx.Panel(self)

更好的選擇是使用wx.ListCtrl,抓EVT_LIST_ITEM_ACTIVATED然後刪除列表,並與項目填充:

__init__: 
self.ListCtrl = wx.ListCtrl(self) 
self.listCtrl.InsertColumn(0, 'name') 
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnChangeFolder, self.listCtrl) 
self.il = wx.ImageList(16, 16) 
self.il.Add(wx.Image("folder.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()) 
self.listCtrl.AssignImageList(self.il) 
self.folders = fileBrowser.print_items("/home/gum/Documents") 
self.UpdateList() 
UpdateList: 
self.listCtrl.DeleteAllItems() 
for index, item in enumerate(self.folders): 
    self.listCtrl.Append((item,)) 
    self.listCtrl.SetItemImage(index, 0) 
    # 0 is the ImageList index, change it for other icons 
OnChangeFolder: 
self.folders = file.Browser.print_items(self.listCtrl.GetFocusedItem().GetText()) 
self.UpdateList 

順便說一句,在WX風格表明,方法和類也駝峯格式,只是你知道:)

+0

那麼在displayContents方法的開頭,我添加了self.panel.Destroy()和self.panel = wx.Panel(self),它清除了面板,但它不會添加新的東西。 – UzSh

+0

也許問題是wx.Yield?順便說一句,你應該編輯你的問題 – lolopop

+0

我試圖刪除和移動它,但沒有運氣。有任何想法嗎?我更新了代碼 – UzSh