【问题标题】:Change console font in Windows在 Windows 中更改控制台字体
【发布时间】:2011-04-05 07:04:00
【问题描述】:

有没有办法在 python 2.6 中更改 Windows 中的控制台字体?

我使用的是 Windows 7。

即:

import os
os.console.font = 'Lucida Console'

*EDIT(无意中发布了这个答案)

更多信息和问题:

我查看了 Windows API: http://msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx

好像有改变控制台字体的功能:

SetCurrentConsoleFontEx

或至少获取有关当前字体的信息:

GetCurrentConsoleFont
GetCurrentConsoleFontEx

我的下一步是找到一个可以使用 Windows API 的 python 模块。 这是一个叫做pywin32的: http://sourceforge.net/projects/pywin32/

你实际导入的模块不是叫pywin32,而是win32api、win32net、win32console 我通过完全的猜测弄清楚了这一点。文档在哪里? 运行帮助('win32console')

那里没有显示提到的字体功能,只是缺少它们。 我在这里错过了什么吗?文档在哪里?或者在哪里有一个具有所有 API 控制台功能的模块...?

【问题讨论】:

标签: python windows


【解决方案1】:

可以使用ctypes 更改控制台字体。一个最小的代码示例如下所示:

import ctypes

LF_FACESIZE = 32
STD_OUTPUT_HANDLE = -11

class COORD(ctypes.Structure):
    _fields_ = [("X", ctypes.c_short), ("Y", ctypes.c_short)]

class CONSOLE_FONT_INFOEX(ctypes.Structure):
    _fields_ = [("cbSize", ctypes.c_ulong),
                ("nFont", ctypes.c_ulong),
                ("dwFontSize", COORD),
                ("FontFamily", ctypes.c_uint),
                ("FontWeight", ctypes.c_uint),
                ("FaceName", ctypes.c_wchar * LF_FACESIZE)]

font = CONSOLE_FONT_INFOEX()
font.cbSize = ctypes.sizeof(CONSOLE_FONT_INFOEX)
font.nFont = 12
font.dwFontSize.X = 11
font.dwFontSize.Y = 18
font.FontFamily = 54
font.FontWeight = 400
font.FaceName = "Lucida Console"

handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
ctypes.windll.kernel32.SetCurrentConsoleFontEx(
        handle, ctypes.c_long(False), ctypes.pointer(font))

我还写了一个不那么简单的例子on my homepage

【讨论】:

  • 注意:我想你也应该顺便在你的主页上包含或链接这个极简版本。
  • 这行得通,但我不知道如何或为什么。你能解释一下吗? O 也许只是一个修改字体大小的终极极简版本?
  • 64 位 上,这将产生 未定义的行为。检查stackoverflow.com/questions/52336257/…
  • @Marfisa 你能修改这个片段以适用于 64 位 Windows 吗?
  • @jay:我在其他答案中进行了解释。它是 argtypes(和 restype)。
【解决方案2】:

【讨论】:

  • 这个库不能控制字体本身,但可以让你和颜色一起玩
【解决方案3】:

可能不会。在 Windows 中,控制台字体是 cmd.exe 程序的属性并由其管理。

与所有事情一样,如果您对 cmd.exe 的工作原理、它存储字体信息的位置、如何强制它重新加载等进行逆向工程,您可能能够破解它(使用任何语言)但是系统没有以受支持和记录的方式提供有关如何执行此操作的功能。

【讨论】:

【解决方案4】:

我查看了 Windows API: http://msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx

好像有更改控制台字体的功能:

SetCurrentConsoleFontEx

或至少获取有关当前字体的信息:

GetCurrentConsoleFont
GetCurrentConsoleFontEx

我的下一步是找到一个可以使用 Windows API 的 python 模块。 这是一个叫做pywin32的: http://sourceforge.net/projects/pywin32/

你实际导入的模块不是叫pywin32,而是win32api、win32net、win32console 我通过完全的猜测弄清楚了这一点。文档在哪里? 运行帮助('win32console')

那里没有显示提到的字体功能,只是缺少它们。 我在这里错过了什么吗?文档在哪里?或者在哪里有一个具有所有 API 控制台功能的模块...?

【讨论】:

  • 你错了——有PyConsoleScreenBuffer.GetCurrentConsoleFont 方法,还有SetConsoleFont (虽然我没有检查它是如何工作的)。 Here 是您可以使用的文档。
【解决方案5】:

好吧,我还没有深入到能够按名称选择字体(我怀疑这是可能的),但是这段代码(假设安装了 pywin32)似乎对它的控制台做了一些有趣的事情(必须是cmd.exe,Console2不行,不知道能不能用powershell):

[C:Users/cji]|1> import win32console
[C:Users/cji]|2> win32console.PyConsoleScreenBufferType( win32console.GetStdHandle( win32console.STD_OUTPUT_HANDLE )  )
         <2> <PyConsoleScreenBuffer:19>
[C:Users/cji]|3> p = _
[C:Users/cji]|6> p.SetConsoleFont( 1 )
[C:Users/cji]|7> p.SetConsoleFont( 2 )
# and so on, to:
[C:Users/cji]|12> p.SetConsoleFont( 11 ) #this is Lucida Console, if I see correctly

文档说,SetConsoleFont“没有在 MSDN 上记录”...但是,它确实 使用当前的控制台字体,所以我认为你应该朝这个方向搜索。

另外,类似的问题:How can I change console font?

【讨论】:

  • SetConsoleFont 似乎正在更改为字体大小,而不是字体另外,我只能在 cmd.exe 中运行您的代码,我尝试制作一个 script.py 会出错
【解决方案6】:

如果有人读到这篇文章时遇到将 PowerShell 提示的默认字体设置为 Lucida Console 不起作用的问题,可能有多种原因(其中许多仅与该特定字体相关)。我在这里写过博客:http://www.meadow.se/wordpress/setting-the-font-of-a-powershell-console-to-lucida-console-wont-work/

简而言之,对我来说,有必要将系统区域设置从瑞典语更改为英语(美国),但还有其他几种可能的解决方案。

希望这会有所帮助。

埃米尔

【讨论】:

    【解决方案7】:

    不可能为一个会话更改它,因为字体设置是系统范围的。

    您可以通过更改注册表中的某些值来更改全局字体,但您必须重新启动系统。

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 2012-04-20
      • 1970-01-01
      • 2011-03-14
      • 2010-12-20
      • 2014-01-05
      • 1970-01-01
      • 2018-04-24
      • 2016-06-27
      相关资源
      最近更新 更多