如何在Python/wxPython中将文件输入作为变量处理?

如何在Python/wxPython中将文件输入作为变量处理?,python,python-2.7,wxpython,wxwidgets,Python,Python 2.7,Wxpython,Wxwidgets,我有一个正在尝试移植到GUI的工作脚本。我是编程新手,所以很多代码可能是黑客的。我愿意接受关于一般做法和方法的建议!下面是我想要移植的函数的基于文本的工作版本: def InitUI(self): self.pdf = None sizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) self.pdf = PDFWindow(self, style=wx.SUNKEN_BORDE

我有一个正在尝试移植到GUI的工作脚本。我是编程新手,所以很多代码可能是黑客的。我愿意接受关于一般做法和方法的建议!下面是我想要移植的函数的基于文本的工作版本:

def InitUI(self):
    self.pdf = None
    sizer = wx.BoxSizer(wx.VERTICAL)
    btnSizer = wx.BoxSizer(wx.HORIZONTAL)
    self.pdf = PDFWindow(self, style=wx.SUNKEN_BORDER)
    panel = wx.Panel(self)

    sizer.Add(self.pdf, proportion=1, flag=wx.EXPAND)

    pdfPicker = wx.FilePickerCtrl(self, wx.ID_ANY,message='Please select the PDF to resize.', wildcard='*.pdf', size=(500,20))
    btnSizer.Add(pdfPicker, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)
    btnSizer.AddStretchSpacer(3)

    self.label = wx.StaticText(self, label='Enter Scale (decimal percent):')
    self.field = wx.TextCtrl(self, value="0.5", size=(50,20))

    btnSizer.Add(self.label, 0, wx.ALL, 8)
    btnSizer.Add(self.field, 0, wx.ALL, 8)

    # .... more GUI code (buttons, etc.)

def resize_file_main(resize, fileout, self, e=None)
    file1 = ask_file_name('resize1', 'input', '', inputDir)
    fileout = ask_file_name('resize1', 'output')
    input1 = str(file1) + '.pdf'
    dir1 = os.path.join(inputDir, input1)
    backup1 = os.path.join(backupDir, str(file1) + '.pdf')

    resize_file(input1)

    try:
        shutil.move(dir1, backup1)
        print input1, "has been successfully moved to the backup folder.\n"
    except:
        print_error('\nThe PDF you entered is opened elsewhere.  The file was not backed up.')
        print "Please move your scanned PDF from /input to /backup or run the backup utility.\n\n      Press enter to continue  ....  "
        print raw_input('')
    continue

def resize_file(filename, filename2 = None):
    output = PdfFileWriter()

    fIn1 = file(os.path.join(inputDir,filename), 'rb')

    inp1 = PdfFileReader(fIn1)
    p1 = inp1.getPage(0)
    p1.scale(.5,.5)
    output.addPage(p1)

    if filename2 is not None:
        fIn2 = file(os.path.join(inputDir,filename2), 'rb')
        inp2 = PdfFileReader(fIn2)
        p2 = inp2.getPage(0)
        p2.scale(.50,.50)
        output.addPage(p2)

    outputStream = file(os.path.join(validateDir,str(fileout) + '.pdf'),"wb")
    output.write(outputStream)
    outputStream.close()
    fIn1.close()
这是我的问题。我想摆脱所有基于文本的用户交互。如何将基于对象的输入转化为可接受的变量?我已经能够实现wx.TextCtrl来输入用户输入,wx.FilePickerCtrl来为输入选择PDF。现在我该如何:

  • 将这些作为变量传递给我的resize_file函数
  • 设置输出位置
  • 设置备份位置+输入PDF名称
  • 是否将wx.TextCtrl值(用于缩放)传递给我的resize_文件函数
这也可能是我的问题:

  • 我有一个InitUI函数来完成所有wxPython的工作
  • InitUi函数中的按钮调用resize\u file\u main
  • resize_file_main只处理输入/输出和移动最终文件 到处都是文件。它还调用resize_文件
  • resize_file是一个可在其他几个领域重复使用的函数 这是剧本的一部分。它接收各种输入/输出,实际上 调整PDF的大小
  • 这是一个糟糕的流程吗?我不知道如何将resize_file_main和resize_file结合起来,因为调用resize_file的不同区域的输入/输出是不同的

    谢谢你的帮助!我知道这很复杂

    编辑:谢谢!我相信我有足够的信息继续前进。我感谢你的帮助

        #initGUIStuff
        ....
        self.resize_btn.Bind(wx.EVT_BUTTON,self.OnResize)
    
     def OnResize(self,evt):
        resize(self.resize_txt.GetValue(),self.file_input.GetPath(),self.outfile_input.GetPath())
    
    也许吧


    老实说,不确定你在问什么…

    要回答这个具体问题:

    如何将基于对象的输入转化为可接受的输入 变量

    您可以访问控件并调用适当的方法:

    self.resize_txt.GetValue()
    self.file_input.GetPath()
    self.outfile_input.GetPath()
    
    要将它们传递给resize函数,只需将这些值传递给resize_file函数即可

    resize_file(self.file_input.GetPath(),
                self.outfile_input.GetPath())
    
    你问的问题太多了。你应该从一个开始,在你前进的过程中创造其他人

    见鬼,午饭前我有时间消磨时间!我会给你一些建议

    让我们看看这个函数:

    def resize_file(filename, filename2 = None)
    
    看看这个函数,我真的不知道函数的输入是什么。它显示文件名和可选文件名2。其中哪一个正在调整大小?如何知道每个参数的作用?您没有记录此函数,这使我深入研究了您的代码,试图确定它的功能

    所以,我深入研究了你的代码。。。这个特殊的函数可能会调整大小并附加PDF。注意,在您的代码中,如何执行相同的代码两次

    fIn1 = file(os.path.join(inputDir,filename), 'rb')
    
    inp1 = PdfFileReader(fIn1)
    p1 = inp1.getPage(0)
    p1.scale(.5,.5)
    output.addPage(p1)
    
    if filename2 is not None:
        fIn2 = file(os.path.join(inputDir,filename2), 'rb')
        inp2 = PdfFileReader(fIn2)
        p2 = inp2.getPage(0)
        p2.scale(.50,.50)
        output.addPage(p2)
    
    不要这样做。使用原则。您应该有一个循环,因为算法基本相同。(无法演示循环自动取款机,午餐前时间不足,可能等我回来时:P)

    你甚至可以想入非非,让你的函数接受无限量的PDF文件。请查看此代码段:

    def resize_file(*args):
        output = PdfFileWriter()
    
        for filename in args:
            fIn1 = file(os.path.join(inputDir, filename), 'rb')
            inp1 = PdfFileReader(fIn1)
            p1 = inp1.getPage(0)
            p1.scale(.5,.5)
            output.addPage(p1)
    
        outputStream = file(os.path.join(validateDir,str(fileout) + '.pdf'),"wb")
        output.write(outputStream)
        outputStream.close()
    
    好吧,我撒谎了,我试着在午饭前把这个挤进去。上面的代码可能不是开箱即用的,但它应该为您指明大致的方向。您应该添加错误捕获,以在未传递任何参数时进行检查(以及其他事项)

    希望有帮助