Показать путь к файлу с помощью WX - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь показать путь к файлу после его удаления в метке NewText, но он показывает мне только путь в верхнем окне ... что я могу сделать, чтобы заставить его работать.

Это мой код, который я пытаюсь показать путь, где 'Путь будет' staticText

import wx            

class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.window = window            

    def OnDropFiles(self, x, y, filename):
        #self.window.SetInsertionPointEnd()
        TempTxt = filename
        print(TempTxt)
        print(type(TempTxt))
        TempTxt = str(TempTxt)
        print(type(TempTxt))
        self.window.LabelTextUpdate(TempTxt)
        return True            


class Example(wx.Frame):
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title)            
        self.InitUI()
        self.Center()            

    def InitUI(self):            
        panel = wx.Panel(self)
        FileDrTr = MyFileDropTarget(self)            
        font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)    
        font.SetPointSize(9)            
        verBox = wx.BoxSizer(wx.VERTICAL)            
        horBoxOne = wx.BoxSizer(wx.HORIZONTAL)
        TextLabel = wx.StaticText(panel, label = 'Drop file hear')
        TextLabel.SetFont(font)
        horBoxOne.Add(TextLabel, flag=wx.RIGHT, border=10)
        DropePlace = wx.TextCtrl(panel)
        DropePlace.SetDropTarget(FileDrTr)            
        horBoxOne.Add(DropePlace, proportion=1)
        verBox.Add(horBoxOne, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)            
        verBox.Add((-1, 10))           
        horBoxTwo = wx.BoxSizer(wx.HORIZONTAL)
        NewText = wx.StaticText(panel, label = 'Path will be')
        horBoxTwo.Add(NewText, flag=wx.RIGHT, border=5)
        verBox.Add(horBoxTwo, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)            
        panel.SetSizer(verBox)            

    def LabelTextUpdate(self, txt):            
        print(txt)
        print(type(txt))
        NewText = wx.StaticText(self, label = txt)           


def main():
    app = wx.App()
    ex = Example(None, title = 'drope and see file path')
    ex.Show()
    app.MainLoop()        

if __name__ == '__main__':
    main()

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

В вашем InitUI вы создали несколько виджетов, одним из которых является NewText, который, как я полагаю, вы хотите использовать для отображения пути к файлу. Вы поместили его в окно с помощью классификатора. Пока все хорошо.

В LabelTextUpdate вы создаете совершенно новый виджет и задаете его текст. Виджет находится внутри вашего окна, вероятно, в верхних левых координатах, поэтому он выглядит так, как будто вы изменили текст окна. Но на самом деле вы разместили новые виджеты.

На самом деле вы хотите изменить метку NewText. Вы должны сохранить ссылку на NewText внутри объекта, поэтому в InitUI вы сделаете (обратите внимание на себя):

    self.NewText = wx.StaticText(panel, label = 'Path will be')
    horBoxTwo.Add(self.NewText, flag=wx.RIGHT, border=5)

И LabelTextUpdate будет использовать эту переменную-член:

def LabelTextUpdate(self, txt):            
    self.NewText.SetLabel(txt)           

Вот и все.

0 голосов
/ 18 февраля 2020

Поскольку мы реагируем на event удаление файла, имеет смысл также назначить обработку событию.
Представляя wx.lib.newevent:
здесь мы создаем наше собственное событие (EVT_DROP_EVENT) и назначьте ему метку (drop_event).

drop_event, EVT_DROP_EVENT = wx.lib.newevent.NewEvent()

Теперь у нас есть событие для bind, и мы можем назначить ему процедуру обратного вызова, в данном случае LabelTextUpdate.

self.Bind(EVT_DROP_EVENT, self.LabelTextUpdate)

Когда файл удаляется, мы устанавливаем событие и запускаем его:

    evt = drop_event(data=TempTxt)
    wx.PostEvent(self.obj,evt)

Процедура обратного вызова вызывается из-за привязки к EVT_DROP_EVENT, и в этой процедуре мы обрабатываем данные.

Надеюсь, это понятно (см. Ниже).

import wx

import wx.lib.newevent
drop_event, EVT_DROP_EVENT = wx.lib.newevent.NewEvent()

class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self, obj):
        wx.FileDropTarget.__init__(self)
        self.obj = obj

    def OnDropFiles(self, x, y, filename):
        #filename is a list of 1 or more files
        #here we are assuming only 1 file
        TempTxt = filename[0]
        evt = drop_event(data=TempTxt)
        wx.PostEvent(self.obj,evt)

        return True


class Example(wx.Frame):
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title)
        self.InitUI()
        self.Center()

    def InitUI(self):
        panel = wx.Panel(self)
        FileDrTr = MyFileDropTarget(self)
        font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
        font.SetPointSize(9)
        verBox = wx.BoxSizer(wx.VERTICAL)
        horBoxOne = wx.BoxSizer(wx.HORIZONTAL)
        TextLabel = wx.StaticText(panel, label = 'Drop file here')
        TextLabel.SetFont(font)
        horBoxOne.Add(TextLabel, flag=wx.RIGHT, border=10)
        DropePlace = wx.TextCtrl(panel)
        DropePlace.SetDropTarget(FileDrTr)

        #Bind the drop event listener
        self.Bind(EVT_DROP_EVENT, self.LabelTextUpdate)


        horBoxOne.Add(DropePlace, proportion=1)
        verBox.Add(horBoxOne, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        verBox.Add((-1, 10))
        horBoxTwo = wx.BoxSizer(wx.HORIZONTAL)
        self.NewText = wx.StaticText(panel, label = 'Path will be')
        horBoxTwo.Add(self.NewText, flag=wx.RIGHT, border=5)
        verBox.Add(horBoxTwo, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
        panel.SetSizer(verBox)

    def LabelTextUpdate(self, event):
        txt = event.data
        self.NewText.SetLabel(txt)


def main():
    app = wx.App()
    ex = Example(None, title = 'drop and see file path')
    ex.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

enter image description here

...