- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
大家好,抱歉,这将是一个大问题。
我现在遇到一个烦人的小障碍。我正在为工作创建一个RSS风格的应用程序,该应用程序将被放置在整个办公室的一些大型LCD显示屏上。基本概念是进行客户端/服务器设置,其中用户将使用自定义编辑器来创建具有所选字体,粗细,大小等的单个文章,然后将它们上传到服务器(最初)将显示文本在LCD屏幕上使用wx.TextCtrl和wx.TextAttr。
这是我要疯的地方。
我能够轻松创建客户端/服务器,我可以使服务器的显示正常工作,但是我找不到能够从右向左传输文本而不会引起闪烁的方法。我们的显示器为42英寸,我尝试使用多种方法来完成此任务,但是对于这些显示器所需的文本大小,我似乎无法摆脱闪烁。
到目前为止,我已经尝试了三种方法使文本运动:
方法1:wx.Ticker()
这是一个控件,看起来确实可以完成我一直想完成的任务,并且当使用较小的字体时,它实际上可以完全满足我的需要。问题是我们不能使用较小的字体,我们将使用的字体会很大,例如36、48、72等。当使用wxpython演示测试代码时,我无法创建足够平滑的效果来考虑这是完成我的任务的一种可行方法,即使在稍微调整他们的代码之后也是如此。
方法2:FadingTextCtrl()(自定义控件)
前一阵子,很早在我找到wx.Ticker之前,我已经创建了一个控件来实现这一壮举,并且已经在之前的一些项目中成功使用了它。我基本上使用EVT_TIMER设置了TextCtrl,将光标设置在行的开头,然后反复删除文本的第一个字符,速度由EVT_TIMER控制。这出人意料地减少了闪烁的频率,但是当它确实选择闪烁时,它就更加引人注目。另一个缺点是,您需要使用固定宽度的字体来避免在删除字符时出现跳动。如果没有固定宽度的字体,由于宽度变化,某些字符的删除速度会比其他字符快,导致文本的运动随机出现加速和减速,从而无法精确控制速度。
方法3:wx.AnimatedCtrl()和自定义生成的动画GIF
到目前为止,这似乎是我最好的选择。我很亲密!
使用PIL以及我在途中可以通过Google找到的一些随机代码片段,我已经能够生成动画GIF并将其放置在wx.AnimatedCtrl()中。在大屏幕上进行了一些测试之后,最终看起来像是我有了解决方案,因为文字流没有任何闪烁!在gif中添加了更多帧之后,我可以使文本比以前的任何方法更平滑地移动。所以就在这里,没有闪烁,完全平滑,然后最可笑的冲突让我傻了……
在构建了适合于按需创建图像的功能之后,我回到了GUI,开始链接所有控件,收集所有文本及其属性以创建动画GIF。我将其全部推送到函数中,然后让我感到惊讶的是,用wx创建字体的方式与使用PIL的方式不同,更具体地说,是如何指定计划用于文本的字体。例如,wx.Font()使用字体的Facename来指定要使用的字体,其中PIL.ImageFont使用字体的路径/文件名来选择要绘制的字体。
您必须在跟我开玩笑.....现在我距离完成我的项目只有一步之遥,而且我一无所获,无法关联我的字体。我可以输入其余字体信息,但不能告诉PIL.ImageFont使用wx.Font()提供的字体数据使用哪种字体。
所以最后,这是我的问题...如何将wx.Font()中的面孔名称与其实际文件名关联起来,以便找到一种方法告诉PIL.ImageFont使用我在控件中定义的文本属性?
我以为昨晚找到注册表项时就中奖了:
“ HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts”
此项包含一串字符串值,这些字符串值定义了Window可用的字体名称以及它们文件的相关路径。这是“控制面板>>字体”所使用的相同信息,因此您会认为这是我缺少的链接。我迅速构建了另一个模块来为值建立索引并为文本生成选定的面部名称/文件名。对于TTF(TrueType)字体,这似乎工作得很好。
然后另一个障碍击中..
大多数Facename都使用多个字体文件来产生斜体,粗体等效果,但是使用wx.Font()似乎总是使用一个面孔名作为字体,例如“ Tahoma”,并使用其他参数(例如style)来指定效果,重量等。因此对于Tahoma Regular,您可以使用字体文件“ TAHOMA.TTF”,而要使用Tahoma Bold,则可以使用字体文件“ tahomabd.ttf”。就是说,在注册表中找到的面孔名称与wxPython中使用的面孔名称不正确匹配。例如:Tahoma的注册表人名可以是Tahoma(TrueType)或Tahoma Bold(True Type)的粗体,尽管wx.Font()都希望使用“ Tahoma”,并且它将与幕后使用的合适字体文件匹配您提供给控件的其他参数。删除注册表面部名称中的垃圾文本很容易,例如(TrueType)或(VGA res),但是对于某些字体,我仍然留下多个面部名称,但这种字体不会显示。
现在这是我目前所在的位置。
我使用PIL通过创建画布,设置所有文本属性来创建动画gif。
创建两个列表,一个用于文本,一个用于每个文本项的属性。例如:
msgs = [“ ***”,“ Header:”,“要打印到图像文件的消息正文。还有什么要说的?真的吗?!?!?!那里是什么?!?”,“ * **“]
字体= [(font_bold_file,48,“#000000”),(font_bold_file,48,“#000000”),(font_norm_file,48,“#000000”),(font_bold_file,48,“#000000”)]
创建一个空白画布,将文本范围的宽度加倍
遍历列表,将文本写在画布上,右对齐,每帧将文本的posX稍微向左移动。
为了避免wx.Font和PIL.ImageFont之间的面部名称/文件名冲突,我想我应该首先在wxPython中使用文本及其所有属性创建位图,然后将其转换为PIL图像。然后,而不是使用PIL.ImageFont绘制文本,而是在每帧上稍微移动文本的位置,我应该将转换后的wxBitmap粘贴到画布上,使用PIL.Image的粘贴在每帧上稍微移动整个位图?
我在这里遇到的问题是找到使用wx的任何DC(ClientDC,PaintDC,(Auto)BufferedDC,MemoryDC)创建位图的正确方法。到目前为止,我能够使用wxMemoryDC和wxBitmap将文本写入位图,但到目前为止,由于它似乎仅限于窗口的ClientSize,因此我无法找到一种方法来设置位图的完整VirtualSize来包含整个图像。我会从一开始就指定完整大小,但是直到获得消息的文本范围时,我才知道该大小。从长远来看,我宁愿创建wxBitmap也不在控件中显示它,因为它的唯一目的是将其传递给PIL进行进一步处理。
所以这是我求救的地方!有人可以请大家阐明一下我如何找到一种将Wx.Font与PIL.ImageFont相关联的方法,这样我就可以使用我的动画gif生成器来完成已经设置好的工作,或者帮助阐明一下如何使用wxPython创建位图,以及如何绘制文本,以便无论当前的ClientSize如何,所有文本都出现在位图中?我可以轻松地将位图转换为PIL,我只需要首先弄清楚如何使用wx创建位图即可!
非常感谢任何可以提供帮助的人员,对于超长职位我深表歉意,但是我应该在几周前完成该项目。每当我认为找到答案时,这个可笑的字体问题就会不断打我!因为这是一个工作项目,如果您需要任何代码示例,请提出要求,我将在不包含任何与工作相关的信息的情况下进行整理。
最佳答案
您是否考虑过将wx.MemoryDC与双缓冲窗口一起使用(即“ bit blitting”)?基本技术是将文本绘制到DC屏幕外,然后将其“ blit”到屏幕上。这样可以消除闪烁。
这是wx Wiki中的discussion about eliminating flicker。
这是wxpython Wiki中的discussion of double buffering。
关于python - wx.Font使用一个面部名称,而PIL.ImageFont使用一个文件名……有什么办法可以将两者联系起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2079033/
ImageFont.truetype 需要一个文件名才能工作,例如: font = ImageFont.truetype("ariblk.ttf") # Arial Black PIL 有没有办法按
我的 python-FotoBox-Script 在我的 Ubuntu labtop 上工作得很好,但是在运行 Raspbian 的 Raspberry-Pi 上脚本有以下问题: pi@raspber
我正在尝试使用 PIL 来预先计算给定文本行在给定字体和大小下的大小。 PIL 似乎或多或少是唯一可行的解决方案。 我不确定font.textsize(..) 返回值的单位是什么。 doc没有具体
我正在尝试计算等宽字体(我希望保持一致)中字形的宽度和高度,但是 ImageFont.getsize()给定不同的单字符串返回不同的值: >>> from PIL import ImageFont >
这个问题在这里已经有了答案: Finding out what characters a given font supports (14 个答案) 关闭 6 年前。 这是一个简短的example .
我创建了一个位图字体,基本上是一个 256x256 png 图像,其中每个字符占据 8x8 block 。我想将它与 Pillow 一起用作 ImageFont,但 Pillow 文档中没有这方面的信
我是第一次使用 chemlab 库。我正在尝试运行一些示例程序,但不断收到以下错误消息: import ImageFont # From PIL ImportError: No module name
我使用以下两种方法为.ttf 字体文件生成文本预览图像 PIL方法: def make_preview(text, fontfile, imagefile, fontsize=30): try
我正在使用 Python 的图像处理库来渲染使用不同字体的字符图像。 这是我用来遍历字体列表和字符列表以输出每种字体的字符图像的代码片段。 from PIL import Image, ImageFo
我正在使用 PIL 的 ImageFont 模块加载字体以生成文本图像。我希望文本紧紧地绑定(bind)到边缘,但是,当使用 ImageFont 获取字体高度时,它似乎包括字符的填充。如红色矩形所示。
我是 Python 新手,尝试运行以下代码。我收到以下错误 “IOError:无法打开资源”。这是因为某些图像特征不再存在(例如 Coval.otf),还是可能是由于写入/读取限制?请让我知道 - 非
当我在 Windows 中编写代码时,这段代码可以很好地加载字体文件: ImageFont.truetype(filename='msyhbd.ttf', size=30); 我猜字体位置是在 Win
我正在尝试使用框绘图字符编写 tiff 图像,但所有有问题的字符都显示为: 方框绘制字符(例如“┌─┐│└┘╞=╡╤╧╘╛”)直接粘贴到源代码中,保存到文本文件时它们正确显示,但我不明白为什么它们'没
我正在使用 python 生成 token 作为安全措施。这是代码: from PIL import Image, ImageDraw, ImageFont image
我已经成功地将一些 Python 代码移植到使用 PIL 的 ImageFont 和 ImageDraw 生成动态图像的 App Engine。唯一剩下的问题是原始代码使用如下调用加载 TrueTyp
背景:我正在编写一个模块来创建带有多个进度条(0-5)的自定义启动屏幕。初始屏幕可以以多种模式显示(全屏无帧、带/不带帧的屏幕百分比或带/不带帧的固定大小),并且可以容纳 0-5 个链接的进度表。进度
我是一名优秀的程序员,十分优秀!