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

时间:2014-05-07 15:52:41

标签: python python-2.7 wxpython wxwidgets

我有一个工作脚本,我试图移植到GUI。我是编程新手,因此很多代码可能都是hack-ish。我对一般做法和方法的建议持开放态度!下面是我工作的基于文本的函数我想要移植:

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_file函数?

这也可能是我的问题:

  1. 我有一个执行所有wxPython东西的InitUI函数
  2. InitUi函数中的按钮调用resize_file_main
  3. resize_file_main只处理输入/输出并移动最终结果 文件周围。它还调用resize_file。
  4. resize_file是一个在其他几个区域重复使用的函数 的脚本。它实际上接收各种输入/输出 调整PDF(s)的大小。
  5. 这是一个糟糕的流程吗?我不确定如何组合resize_file_main和resize_file,因为调用resize_file的不同区域的输入/输出是不同的。

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

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

2 个答案:

答案 0 :(得分:0)

    #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())

可能?

不确定你要求说实话......

答案 1 :(得分:0)

回答这个具体问题:

  

如何获取基于对象的输入并将其转换为可通过的输入   变量

您可以访问控件并调用相应的方法:

self.resize_txt.GetValue()
self.file_input.GetPath()
self.outfile_input.GetPath()

要将它们传递给resize,function,只需将这些值传递给resize_file函数。

resize_file(self.file_input.GetPath(),
            self.outfile_input.GetPath())

你在TBH问了太多问题。你应该从一开始,然后在你进步时创建其他人。

到底是什么,我有时间在午餐前杀人!我会给你一些指示。

让我们来看看这个函数:

def resize_file(filename, filename2 = None)

看看这个函数,我真的不知道函数的输入是什么。它说文件名和可选的filename2。哪些正在调整大小?我怎么知道每个参数的作用?你没有记录这个函数,这让我深入研究你的代码,试图确定它的作用。

所以,我挖掘了你的代码...而且看起来这个特定的函数调整大小并可能附加pdfs。请注意在代码中,如何执行两次相同的代码?

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)

不要这样做。使用DRY原则。你应该有一个循环,因为算法基本相同。 (无法说明循环atm,午餐前时间不多了,也许是我回来的时候: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()

好的,我说谎了,我试着在午餐前挤进去。上面的代码可能无法开箱即用,但它应该指向大致方向。您应该添加错误捕获以检查何时没有传递参数(等等)。

希望它有所帮助!