wxPython/ReportLab:如何在单击按钮时创建和打开.pdf文件 [英] wxPython/ReportLab: How to create and open a .pdf file on button clicked

查看:319
本文介绍了wxPython/ReportLab:如何在单击按钮时创建和打开.pdf文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

早上好, 在大约三天的时间里,我一直在尽最大努力来解决这个问题!我有一个工作正常的wxFrame以及一个工作正常的ReportLab pdf脚本.分别参见下面的代码文件(注意:data1.py是GUI,而data2.py是正在运行的pdf脚本). 我的问题是: 1)我希望仅在按保存到PDF"按钮后才能运行pdf脚本 2)应该将名称字段的值(存储在变量"NameString"中)添加到生成的pdf文件中.

Good day all, For about 3days I have been trying hardest to get my way around this! I have a perfectly working wxFrame as well as a perfectly working ReportLab pdf script. See the code files below respectively (Note: data1.py is the GUI while data2.py is the running pdf script). My problems are:- 1) I want the pdf script to run only after I press the "Save To PDF" button 2) The value of the name field (as stored in a variable "NameString") should be added to the generated pdf file.

此刻,如果我运行脚本(data2.py),它将同时创建Frame和pdf文件(不包括"NameString").那不是我想要的,我只希望在单击/按下保存到PDF"按钮后打开pdf文件并包含"NameString".

At the moment, if I run the script (data2.py) it creates but the Frame and the pdf file (without including the "NameString") at the same time. That is not what I want, I want the pdf to open and include the "NameString" only after I clicked/press the "Save To PDF" button.

提前感谢您的时间.

data1.py

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 250,150 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        DataBox = wx.BoxSizer( wx.HORIZONTAL )

        gSizer2 = wx.GridSizer( 0, 2, 0, 0 )

        self.NameLabel = wx.StaticText( self, wx.ID_ANY, u"Name", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.NameLabel.Wrap( -1 )
        self.NameLabel.SetFont( wx.Font( 13, 70, 90, 90, False, wx.EmptyString ) )

        gSizer2.Add( self.NameLabel, 0, wx.ALL, 5 )

        self.NameField = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        gSizer2.Add( self.NameField, 1, wx.ALL, 5 )

        self.SaveToPDF = wx.Button( self, wx.ID_ANY, u"Save To PDF", wx.DefaultPosition, wx.DefaultSize, 0 )
        gSizer2.Add( self.SaveToPDF, 0, wx.ALL, 5 )


        DataBox.Add( gSizer2, 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5 )


        self.SetSizer( DataBox )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.SaveToPDF.Bind( wx.EVT_BUTTON, self.SaveToPDF_Function )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def SaveToPDF_Function( self, event ):
        event.Skip()

data2.py

#!/usr/bin/python
# -*- coding: utf-8 -*- 


import wx
from data1 import MyFrame1

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A3
from reportlab.lib.pagesizes import landscape

import os
import tempfile
import threading



class MyFrame2(MyFrame1):
    def __init__(self, parent):
        MyFrame1.__init__ (self, parent)



    def SaveToPDF_Function( self, event ):

        NameString = self.NameField.GetValue()
        print NameString




file_not_fount = "Selected file doesn't exist!"


class Launcher(threading.Thread):
    def __init__(self,path):
        threading.Thread.__init__(self)
        self.path = 'myFile.pdf'
    def run(self):
        self.open_file(self.path)



    def open_file(self,path):

        if os.path.exists(path):
            if os.name == 'posix':
                subprocess.call(["xdg-open", path])
                #os.popen("evince %s" % path)
            else:
                os.startfile(path)
        else:
            wx.MessageBox(self.file_not_fount,
                          self.title,
                          wx.OK|wx.ICON_INFORMATION)

# NameString = raw_input("Enter ur text: ")

c = canvas.Canvas("myFile.pdf", pagesize=landscape(A3))

c.drawCentredString(600, 800, 'I want this to open only after I clicked the "Save To PDF" button. Also, the text field value (NameString variable) should appear here =>'  + 'NameString' )

c.save()

Launcher('myFile.pdf').start()






app = wx.App(0)
MyFrame2(None).Show()
app.MainLoop()

推荐答案

这是我遇到的一个简单的工作解决方案,用于自动打开由ReportLab生成的pdf文件.

Here is a simple working solution I came accross to auto open pdf file generated with ReportLab.

照常导入子流程和ReportLab模块.然后将此函数链接到您的事件(代码的魔术部分是subprocess.Popen .....)

def SaveToPDF_Function( self, event ):

    NameString = self.NameField.GetValue()

    try:
        c = canvas.Canvas("myFile.pdf", pagesize=landscape(A3))

        c.drawCentredString(600, 800, 'OPENED... Welcome to ReportLab! This is my FIRST App...'  + NameString )

        c.save()

        subprocess.Popen(['myFile.pdf'], shell=True)

    except IOError:
        print 'The file is already OPENED!'

希望这对以后的搜索有所帮助.

Hope this help someone in future search.

这篇关于wxPython/ReportLab:如何在单击按钮时创建和打开.pdf文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆