Добавление исполняемого кода в мои текстовые поля графического интерфейса wxpython - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время у меня есть рабочий сценарий, который позволяет мне создать копию файла резервной копии, взять эту копию и переименовать ее в Filename_New, а затем переименовать исходный файл в Filename_Bad.

Я новичок в создании графического интерфейса пользователя и кода Python в целом, но в настоящее время у меня есть графический интерфейс, и я хотел бы привязать 3 отдельных фрагмента кода к различным полям в графическом интерфейсе, чтобы при вводе имени файлана шаге 1 в графическом интерфейсе он выполняет этот раздел моего кода на Python.

Не совсем уверен, как объединить эти две вещи вместе, поэтому любые советы будут с благодарностью.Заранее спасибо, надеюсь, приведенный ниже код отформатирован правильно.

Вот фрагмент моего кода на Python для выполнения процесса копирования.

У меня есть два других варианта вышеописанного процесса, которые добавляют _NEW и _BAD к другим файлам.

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


### Do all your imports as needed

import wx, wx.lib.newevent

import os, sys, copy, shutil

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

        self.InitUI()
        self.Centre()

    def InitUI(self):

        panel = wx.Panel(self)
        font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
        font.SetPointSize(9)
        #### As already mentioned you defined a wx.BoxSizer but later were using
        #### a wx.GridBagSizer. By the way I also changed a little bit the span
        #### and flags of the widgets when added to the wx.GridBagSizer
        sizer = wx.GridBagSizer(1, 1)

        text = wx.StaticText(panel, label="Enter the VR File That Crashed: ")
        sizer.Add(text, pos=(0, 0), span=(1, 2), flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.BOTTOM, border=5)

        #### tc will be used by other methods so it is better to use self.tc
        self.tc = wx.TextCtrl(panel)
        sizer.Add(self.tc, pos=(1, 0), span=(1, 2),
            flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5)

        #### Changed the label of the buttons
        buttonOk = wx.Button(panel, label="Search File", size=(90, 28))
        buttonClose = wx.Button(panel, label="Do Stuffs", size=(90, 28))
        sizer.Add(buttonOk, pos=(2, 0), flag=wx.ALIGN_CENTER|wx.RIGHT|wx.BOTTOM, border=10)
        sizer.Add(buttonClose, pos=(2, 1), flag=wx.ALIGN_CENTER|wx.RIGHT|wx.BOTTOM, border=10)

        panel.SetSizer(sizer)

        #### This is how you Bind the button to a method so everytime the button
        #### is clicked the method is executed
        buttonOk.Bind(wx.EVT_BUTTON, self.SearchFile)
        buttonClose.Bind(wx.EVT_BUTTON, self.DoStuffs)

    def SearchFile(self, event):
        #### This is how you use the wx.FileDialog and put the selected path in 
        #### the wx.TextCtrl
        dlg = wx.FileDialog(None, message="Select File", style=wx.FD_OPEN|wx.FD_CHANGE_DIR|wx.FD_FILE_MUST_EXIST|wx.FD_PREVIEW)
        if dlg.ShowModal() == wx.ID_OK:
            self.tc.SetValue(dlg.GetPath())
        else:
            pass 

    def DoStuffs(self, event):
        #### This is how you get the path to the selected/typed file and then
        #### do your stuffs
        def copy_vrb(oldvr):
            newvrb = os.path.splitext(oldvr)[0] + "_COPY"
            shutil.copy(oldvr, newvrb + ".vrb")

        def file_rename(oldvr):
            newvrb = os.path.splitext(oldvr)[0] + "_BAD"
            shutil.copy(oldvr, newvrb + ".vr")

        def rename_copy(oldvr):
            newvrb = os.path.splitext(oldvr)[0] + "_NEW"
            shutil.copy(oldvr, newvrb + ".vr")

        oldvrb = self.tc.GetValue()
        copy_vrb(oldvr)
        file_rename(oldvr)
        rename_copy(oldvr)

        print(oldvr)


if __name__ == '__main__':
    app = wx.App()
    ex = Example(None, title='Rename')
    ex.Show()
    app.MainLoop()
else:
    pass

Введите имя файла в графическом интерфейсе и получитекод выполняется для этого имени файла.

1 Ответ

2 голосов
/ 31 мая 2019

Добро пожаловать в StackOverflow.

Короткий ответ на ваш вопрос заключается в том, что вам нужно Bind использовать кнопки в вашем графическом интерфейсе каким-либо способом. Вы можете увидеть в коде ниже, как это делается.

Я немного изменил ваш код, потому что вы определяли wx.BoxSixer, но затем вы добавляли виджеты в wx.GridBagSizer. Кроме того, я изменил кнопки, чтобы показать вам, как искать файл с wx.FileDialog, на тот случай, если вы не хотите вводить путь к файлу, и потому что я предположил (возможно, неправильно), что кнопка Закрыть должна закрыть приложение. Нет необходимости в этом, просто нажмите X, и приложение закроется.

Код с комментариями

### Do all your imports as needed

import wx, wx.lib.newevent

import os, sys, copy, shutil

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

        self.InitUI()
        self.Centre()

    def InitUI(self):

        panel = wx.Panel(self)
        font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
        font.SetPointSize(9)
        #### As already mentioned you defined a wx.BoxSizer but later were using
        #### a wx.GridBagSizer. By the way I also changed a little bit the span
        #### and flags of the widgets when added to the wx.GridBagSizer
        sizer = wx.GridBagSizer(1, 1)

        text = wx.StaticText(panel, label="Enter the VR File That Crashed: ")
        sizer.Add(text, pos=(0, 0), span=(0, 2), flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.BOTTOM, border=5)

        #### tc will be used by other methods so it is better to use self.tc
        self.tc = wx.TextCtrl(panel)
        sizer.Add(self.tc, pos=(1, 0), span=(0, 2),
            flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5)

        #### Changed the label of the buttons
        buttonOk = wx.Button(panel, label="Search File", size=(90, 28))
        buttonClose = wx.Button(panel, label="Do Stuffs", size=(90, 28))
        sizer.Add(buttonOk, pos=(2, 0), flag=wx.ALIGN_CENTER|wx.RIGHT|wx.BOTTOM, border=10)
        sizer.Add(buttonClose, pos=(2, 1), flag=wx.ALIGN_CENTER|wx.RIGHT|wx.BOTTOM, border=10)

        panel.SetSizer(sizer)

        #### This is how you Bind the button to a method so everytime the button
        #### is clicked the method is executed
        buttonOk.Bind(wx.EVT_BUTTON, self.SearchFile)
        buttonClose.Bind(wx.EVT_BUTTON, self.DoStuffs)

    def SearchFile(self, event):
        #### This is how you use the wx.FileDialog and put the selected path in 
        #### the wx.TextCtrl
        dlg = wx.FileDialog(None, message="Select File", style=wx.FD_OPEN|wx.FD_CHANGE_DIR|wx.FD_FILE_MUST_EXIST|wx.FD_PREVIEW)
        if dlg.ShowModal() == wx.ID_OK:
            self.tc.SetValue(dlg.GetPath())
        else:
            pass 

    def DoStuffs(self, event):
        #### This is how you get the path to the selected/typed file and then
        #### do your stuffs
        oldvrb = self.tc.GetValue()
        print(oldvrb)


if __name__ == '__main__':
    app = wx.App()
    ex = Example(None, title='Rename')
    ex.Show()
    app.MainLoop()
else:
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...