gpt4 book ai didi

python - wx.Font使用一个面部名称,而PIL.ImageFont使用一个文件名……有什么办法可以将两者联系起来?

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:29 27 4
gpt4 key购买 nike

大家好,抱歉,这将是一个大问题。

我现在遇到一个烦人的小障碍。我正在为工作创建一个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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com