Skip to main content
 首页 » 编程设计

python之按下按钮时的wxpython刷新窗口

2025年05月04日8lautakyan007

我的 Python 程序遇到了一些问题。基本上,它是一个非常非常简单的文件管理器。

我一直试图让它在文件夹之间移动(用户单击一个文件夹,程序刷新显示并显示文件夹的内容)。

我遇到的问题是我似乎无法获得刷新显示的按钮,然后在单击时用新文件夹和文件填充它。

这是我在 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 方法)?

EDIT2:我让它工作了。我所做的是,我将其添加到我的 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) 

请您参考如下方法:

我觉得是你的问题

  • 为每个文件夹创建新面板
  • 不要删除旧面板

我建议您将旧面板保存在 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 风格表明方法和类也是驼峰式的,你知道的:)