无法使用Python绘制Unicode字符PyCDC.DrawText公司()

2024-09-27 23:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用PyCDC.DrawText公司(),但它似乎绘制了两个ASCII字符。例如,当尝试绘制“Я”(\u042F)时,我得到:http://i.stack.imgur.com/hh9RJ.png

我的字符串定义为Unicode字符串:

text = u'Я'

文件开头是:

^{pr2}$

我还尝试过打印字符串(到控制台),结果很好,所以问题可能出在DrawText()的实现中。在

谢谢!在


Tags: 字符串comhttp定义pngstackascii绘制
2条回答

David:“这些函数必须通过PyWin32来实现”,实际上,它们不是。在

经过几十个小时的搜索,试图找出win32uiwin32gui等的位置,可能有一个隐藏的TextOutW,我自己编写了一个有其他缺陷的C扩展,编写了一个外部程序。从python内部调用发现HDC句柄不能转移到其他进程,我终于偶然发现了这个基于ctypes的简单的预编程解决方案,如上面所示:

  1. 您需要TextOutW或类似的函数,就像您在windows gdi c中使用的一样。尽管有一个名为win32gdi.DrawTextW的函数,它的工作原理与windows对应的函数完全相同,但有时您需要特别使用,例如TextOutExtTextOut等。,在pywin32win32gdi的unicodeW后缀版本中不可用
  2. 要实现这一点,不要使用有限的win32gui函数,而是使用ctypes提供的windll.gdi32.TextOutW

    from ctypes import *
    import win32gdi
    
    # init HDC
    # set hdc to something like 
    hdc = win32gdi.CreateDC(print_processor, printername, devmode)
    
    # here comes the ctypes function that does your deal
    text = u'Working! \u4e00\u4e01'
    windll.gdi32.TextOutW(hdc, x, y, text, len(text))
    
    # ... continue your prog ...
    

玩得开心点

要在Windows上输出Unicode文本,需要用UTF-16编码,并调用^{}^{}Win32函数的宽字符版本。如果您不熟悉,windowsapi本机是UTF-16,并且有并行的8位ANSI版本来支持遗留版本。在

我对您使用的Win32包装器一无所知,但怀疑PyCDC.DrawText()正在调用这些Win32函数中任何一个的ANSI版本。您的解决方案可能涉及找到一种调用DrawTextW()或{}的方法。您可以用ctypes来实现,而且这些函数肯定也可以通过PyWin32使用。在

但是,我可能会选择更高级别的东西,比如PyQt。在

相关问题 更多 >

    热门问题