在上一篇文章“ 使用此温度转换脚本学习Perl”中 ,我向读者介绍了Perl脚本。 当我第一次开始使用Scribus(一种桌面发布(DTP)应用程序,用于创建要以印刷或在线发布的PDF格式)时,Perl是我最熟悉的脚本语言,甚至尝试将其与Scribus一起使用。 有一次我制作了一个Perl脚本,它将从头开始以Scribus格式(SLA)生成文件。 尽管肯定可行,但实际上并没有太多实际用途。
Scribus附带了一个名为Scripter的插件,该插件允许使用许多内部Python命令在Scribus中执行各种分析,创建和编辑操作,以及使用Python提供的所有其他功能。 正如我在有关Perl入门的文章中所提倡的那样,我首先查看了Python附带的各种脚本,并来回引用了各种参考,并制作了在Scribus之外使用的各种脚本。 如果您不能使基本算法在Scribus之外以某种方式起作用,那么它肯定不会在其中起作用。
让我们从稍后可能在DTP设置中使用的基本实用工具开始。 这是一个名为date.py的简单脚本:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from
datetime
import date
today
= date.
today
(
)
d
= today.
strftime
(
"%A, %d %B %Y"
)
print d
在顶部,我们有她的爆炸行( # ,与Perl一样),但是这有点不同,使用/usr/bin/env
查找当前的系统Python解释器。 下一个并不是绝对必要的,因为UTF-8是大多数Linux系统上的默认字符编码,但是它确实突出了我从Windows计算机复制的脚本修改此脚本时遇到的一个问题。 当我尝试运行此命令时,我不断收到错误消息,它找不到/usr/bin/env python^M
最终,我发现文件的编码是(如Windows中一样),尽管脚本中存在此行,但在行的末尾有回车符。 我要做的就是在文件上运行dos2unix
。
当我们谈到可执行行时,请注意,在Python中,这些行不是以分号结尾,而是以结尾。 另外,变量名也不能以特殊字符开头。 from
和import
是Python命令; datetime
和date
是变量名。 在这种特定情况下, datetime
指代该名称的Python模块,而date
指代该模块中的特定函数。 没有此语句,基本的Python解释器将不了解该命令。 稍后,我们将看到这如何适用于Scribus。
我们的下一条语句today
使用收集到的date.today()
信息设置一个新变量。 Python在这里也特别注重语法。 today
是在date
执行的一项运算,其结果现在保存在today
的变量today
。 从某种意义上说,这对我来说是不幸的变量命名,但同时表明Python将它们视为两个独立的实体,其语法结构对此做了澄清。
接下来,就像在Python中使用sprintf
命令一样,我们为今天的日期设置输出的特殊格式: A
是星期几, d
是月份, B
是月份, Y
是年份。 因此,当我运行该脚本时,其输出为:
Thursday , 13 October 2016
看看格式中的逗号如何传递到输出? 您可以查找datetime
模块,以查看格式化的选项。
作为一个独立的脚本,考虑到我可以随时从命令行运行date
,因此这是一个非常弱的脚本。 现在让我们考虑一下DTP和Scribus —例如,假设我们正在制作一份新闻通讯或其他期刊文档,希望在其上具有发布日期,也许在标题中。 从概念上讲,您只需运行此小脚本,就完成了。 除了我们关心的DTP中的许多设计问题之外。
桌面发布和页面设计
在Scribus之类的DTP程序中,默认情况下您没有任何要使用的东西。 在创建一个或打开一个已保存的文档之前,您没有文档。 当您打开一个新文档时,默认情况下它只有一页,除非您告诉它,否则它不会自动进行其他任何操作。 此外,页面只是工作的空间。 您不会开始在页面上打字或插入图片; 相反,您必须在框架环境中工作。 框架是您可以在其中输入文本,图像或其他图形(例如表格或图表)的空间,但是它们是唯一的-您不能在图像框架中输入文本,反之亦然。
使用脚本,或更具体地说是Scribus中的Scripter,您还必须使用这种环境。 我尝试在Scribus中使用脚本进行推广的一个一般规则是,当这是最有效的工作方式时,应使用图形环境,但是当您要执行重复的,乏味的或可能困难的任务时,则应使用脚本一些规律性。
重复性任务示例
让我们发明一个重复的任务,以便可以利用有关datetime
的Python逻辑。 想象一下,我们有一个通讯,其中有一个模板,在标题中,我们有以下内容:
![带有日期的OpenSource Gazette示例横幅 OpenSource Gazette sample banner with date](https://i-blog.csdnimg.cn/blog_migrate/9f5c78a0798e3aaeaa03701de171066b.png)
从结构上讲,这是一个文本框架,具有一定的尺寸,并在页面上具有特定的X,Y位置,并带有两点宽的黑色边框。 文本居中,第一行是20点Fontin Bold,第二行是14点Fontin Regular,具有自动行距,并且在顶部增加了9个空格(在Scribus中称为“ Distance”)。我们的脚本任务,我们只想更新日期,因此我们将使用其中包含此框架的现有文档。
我们创建了脚本,打开文档,运行脚本,然后完成了,但是请稍等。 Scripter如何知道要处理哪个页面元素? 与Scripter之外的Scribus一样,您必须在当前页面上选择一个项目才能开始工作(如果您不制作新元素)。
让我们提出一个操作列表:
- 识别选定的框架。 (是否已选中?是文本框吗?)
- 清除所有文本,或仅清除日期。
- 创建要输入的新日期,然后在正确的位置输入框架。
- 确保使用正确的字体,字体大小和对齐方式。
这是我们最终想出的(不要让它的大小吓到您):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# gazette_date.py
try :
import scribus
except
ImportError :
print
"Unable to import the 'scribus' module. This script will only run within"
print
"the Python interpreter embedded in Scribus. Try Script->Execute Script."
sys .
exit
(
1
)
from
datetime
import date
if
not scribus.
haveDoc
(
) :
scribus.
messageBox
(
'Scribus - Script Error'
,
"No document open"
, scribus.
ICON_WARNING
, scribus.
BUTTON_OK
)
sys .
exit
(
1
)
if scribus.
selectionCount
(
)
==
0 :
scribus.
messageBox
(
'Scribus - Script Error'
,
"There is no object selected. \n Please select a text frame and try again."
,
scribus.
ICON_WARNING
, scribus.
BUTTON_OK
)
sys .
exit
(
2
)
if scribus.
selectionCount
(
)
>
1 :
scribus.
messageBox
(
'Scribus - Script Error'
,
"You have more than one object selected. \n Please select one text frame and try again."
,
scribus.
ICON_WARNING
, scribus.
BUTTON_OK
)
sys .
exit
(
2
)
textbox
= scribus.
getSelectedObject
(
)
ftype
= scribus.
getObjectType
( textbox
)
if
( ftype
!=
"TextFrame"
) :
scribus.
messageBox
(
'Scribus - Script Error'
,
"This is not a textframe. Try again."
, scribus.
ICON_WARNING
, scribus.
BUTTON_OK
)
sys .
exit
(
2
)
today
= date.
today
(
)
d
= today.
strftime
(
"%A, %B %d, %Y"
)
length
= scribus.
getTextLength
(
)
scribus.
selectText
(
19
, length-
19
, textbox
)
scribus.
deleteText
( textbox
)
scribus.
insertText
( d
, -
1
, textbox
)
length
= scribus.
getTextLength
(
)
scribus.
selectText
(
19
, length-
19
, textbox
)
scribus.
setFontSize
(
14.0
, textbox
)
脚本说明
从try:
到最后一个sys.exit(2)
都是错误检查样板,您可以轻松地从一个脚本复制到另一个脚本(或从其他人的脚本复制)。 你不必把所有这些错误检查在那里,如果你不介意你的脚本崩溃(直到你弄清楚你没有选择的对象,或者它不是一个文本框,等等)。 至少,您确实需要具有import scribus
并且该脚本需要from datetime import date
。 这些检查的作用是提供有关脚本失败原因的反馈,即使对于您自己,这也是一件好事。
从today = date.today()
开始today = date.today()
应该看起来很熟悉。 因为我们已经检查了这是一个选中的文本框架,所以我们可以在其上获取getTextLength()
。 我们必须在scribus
以便Python知道这是Scripter命令。 我们将使用该文本长度从框架中有选择地删除日期。 我们不知道日期中将有多少个字符,但是我们知道这是总数减去第一行中的数字。 在Scribus中,对selectText()
命令的字符计数从0开始,并且您必须计算在第一行末尾隐含的\n
,这就是我想出19
作为第二行的第一个字符的方式。
我以为我会很幸运,可以在insertText()
命令之后完成操作,因为旧文本消失了,新文本就在那里了,具有正确的字体,并且居中,但是字体大小为16pt。 我对此没有很好的解释,因为我曾尝试在原始版本中多次重新键入; 在换行到下一个过渡的过程中,磅值已更改。 最简单的答案是在重新检查textLength()
和setFontSize()
以修复后重新选择日期。 确实不错。
保存脚本后,选择的编剧 | 在Scribus菜单中执行脚本以查找您的脚本并运行它。 如果您最近运行脚本,它会出现在脚本编写者 | 最近的脚本列表。
故障排除
可以肯定的是,该脚本并没有做什么用,但应该可以帮助您掌握在Scribus中使用Python的过渡。 通常,我会慢慢构建脚本,逐步实现目标,直到获得所需的最终结果。
有时,当您执行了一系列操作后,您将无法确定正在发生的事情。 例如,如果耐心地计数字符不起作用怎么办? 我经常使用messageBox()
命令作为故障排除工具。 在以length
开头的任何一行之后,我们可以插入以下内容(全部插入一行):
scribus.
messageBox
(
'Length Value'
,
"Text length is " +
str
( length
)
, scribus.
ICON_NONE
, scribus.
BUTTON_OK
)
脚本到达这一点时,它将暂停以显示此消息,然后在单击“ 确定”按钮后继续执行。 请注意,与Perl相比,您必须将整数length
转换为字符串以将其与前面的文本组合在一起。 如果您在valueDialog()
命令中请求用户输入,则会发生相反的情况。 始终将其视为字符串,因此,如果要将其用作数字,则必须使用int()
或float()
。
Scribus中包含有关Scripter命令的文档,并且您还可以在Wiki上找到许多脚本来查看和借鉴。
翻译自: https://opensource.com/life/16/10/python-scripting-scribus