Функция в wxpython неправильно работает
Текст кода:
import wx,os
from wx.lib.splitter import MultiSplitterWindow
i=wx.ID_ANY
app=wx.App()
class VerticalSplitter(MultiSplitterWindow):
def __init__(self,parent):
super().__init__(parent,style=wx.SP_LIVE_UPDATE)
self.SetOrientation(wx.VERTICAL)
class HorizontalInVerticalSplitter(MultiSplitterWindow):
def __init__(self,parent):
super().__init__(parent,style=wx.SP_LIVE_UPDATE)
class HorizontalSplitter(MultiSplitterWindow):
def __init__(self,parent):
super().__init__(parent,style=wx.SP_LIVE_UPDATE)
class FileManager(wx.Panel):
def __init__(self,parent):
super().__init__(parent)
self.path='c:\\Users\\user\\desktop\\'
self.buttonSizer=wx.BoxSizer()
self.findButton=wx.Button(self,i,'Найти...')
self.backButton=wx.Button(self,i,label="Назад")
for x in [self.backButton,self.findButton]:
self.buttonSizer.Add(x)
self.mainSizer=wx.BoxSizer(wx.VERTICAL)
self.listBox=wx.ListBox(self,choices=list(os.listdir(self.path)),style=wx.LB_HSCROLL)
for r in [self.buttonSizer,self.listBox]:
self.mainSizer.Add(r)
self.SetSizer(self.mainSizer)
self.Bind(wx.EVT_BUTTON,self.back,self.backButton)
self.Bind(wx.EVT_LISTBOX,self.open,self.listBox)
def open(self,evt):
join=os.path.join(self.path+list(os.listdir(self.path))[self.listBox.GetSelection()])
if os.path.isdir(join):
try:
self.path=join+'\\'
self.listBox.Set(os.listdir(self.path))
except:
raise Exception("попытка открыть системную папку")
else:
pass#OPEN FILE... todo
def back(self,evt):
print("back")
try:
self.path=os.path.split(self.path)[0]
self.listBox.Set(os.listdir(self.path))
except:
raise Exception("попытка открыть системную папку")
class Frame(wx.Frame):
def __init__(self):
super().__init__(None,title='ACE')
self.fileManager=FileManager(self)
frame=Frame()
frame.Show()
app.MainLoop()
Проблема в функции back из класса FileManager. При нажатии на кнопку self.backButton из того же класса функция срабатывает сразу (это понятно по print ('back')), но self.listBox изменяется только после второго нажатия. Как сделать, чтобы self.listBox изменялся сразу с первого нажатия на кнопку?
Ответы (1 шт):
Непонятно зачем вы добавляете \\ к join. os.listdir и без этого разберет директорию.
Вместо list(os.listdir(self.path))[self.listBox.GetSelection()] можно использовать self.listBox.GetStringSelection(), который возвращает значение (текст) выбранной строки в списке.
Родительскую директорию можно найти с помощью специального метода os.path.dirname (os.path.split не нужен).
def open(self,evt):
fname = self.listBox.GetStringSelection()
join = os.path.join(self.path, fname)
if os.path.isdir(join):
try:
self.path = join
self.listBox.Set(os.listdir(self.path))
except:
raise Exception("попытка открыть системную папку")
else:
pass#OPEN FILE... todo
def back(self,evt):
try:
self.path = os.path.dirname(self.path)
self.listBox.Set(os.listdir(self.path))
except:
raise Exception("попытка открыть системную папку")