20

Tkinterでインターフェイスを作成していますが、カスタムフォントが必要です。たとえば、特定のサイズなどのHelveticaだけでなく、特定のプラットフォームで通常使用できるフォント以外のフォントもあります。これは、プログラムとともに画像ファイルまたは(できれば)Truetypeフォントファイルなどとして保持されるものになります。プログラムを使用するすべてのマシンに目的のフォントをインストールする必要はありません。同じディレクトリにあるプログラムと一緒にフォントを持ち運びたいだけです。

tkFontモジュールはこのようなことをするはずのように見えますが、プログラムを実行しているシステムが通常アクセスできないフォントのファイル名がどこにあるのかわかりません。よろしくお願いします。

4

7 に答える 7

17

WindowsのTkinterに外部フォントを取り込む方法があります。

これを機能させるための重要なコードは、次の関数です。

from ctypes import windll, byref, create_unicode_buffer, create_string_buffer
FR_PRIVATE  = 0x10
FR_NOT_ENUM = 0x20

def loadfont(fontpath, private=True, enumerable=False):
    '''
    Makes fonts located in file `fontpath` available to the font system.

    `private`     if True, other processes cannot see this font, and this 
                  font will be unloaded when the process dies
    `enumerable`  if True, this font will appear when enumerating fonts

    See https://msdn.microsoft.com/en-us/library/dd183327(VS.85).aspx

    '''
    # This function was taken from
    # https://github.com/ifwe/digsby/blob/f5fe00244744aa131e07f09348d10563f3d8fa99/digsby/src/gui/native/win/winfonts.py#L15
    # This function is written for Python 2.x. For 3.x, you
    # have to convert the isinstance checks to bytes and str
    if isinstance(fontpath, str):
        pathbuf = create_string_buffer(fontpath)
        AddFontResourceEx = windll.gdi32.AddFontResourceExA
    elif isinstance(fontpath, unicode):
        pathbuf = create_unicode_buffer(fontpath)
        AddFontResourceEx = windll.gdi32.AddFontResourceExW
    else:
        raise TypeError('fontpath must be of type str or unicode')

    flags = (FR_PRIVATE if private else 0) | (FR_NOT_ENUM if not enumerable else 0)
    numFontsAdded = AddFontResourceEx(byref(pathbuf), flags, 0)
    return bool(numFontsAdded)

loadfontフォントファイルへのパス(、、、、、、、、、、、のいずれか)を指定して呼び出した後、インストールされて.fonいる他のフォントと同じようにフォントをロードできます。好きな場所で使用できます。[詳細については、 MSDNを参照してください].fnt.ttf.ttc.fot.otf.mmm.pfb.pfmtkFont.Font(family=XXX, ...)

ここでの最大の注意点は、フォントの名前が必ずしもファイルの名前であるとは限らないことです。フォントデータに埋め込まれています。名前を解析しようとする代わりに、フォントブラウザのGUIで名前を検索し、アプリケーションにハードコードする方がおそらく簡単です。編集:または、以下のpatthoytのコメントに従って、それを検索しますtkFont.families()(最後の項目として、またはより堅牢に、フォントをロードする前後のファミリのリストを比較することによって)。

私はこの関数をdigsbyライセンス)で見つけました。unloadfontプログラムの実行が完了する前にフォントを削除したい場合は、そこに関数が定義されています。private(プログラムの終了時にフォントをアンロードする設定に依存することもできます。)

興味のある方のために、ここに数年前の[TCLCORE]に関するこのトピックに関するディスカッションがあります。もう少し背景:MSDNのフォント

于 2015-06-03T21:44:14.820 に答える
8

これはWindowsでは機能しましたが、Linuxでは機能しないようです。

import pyglet,tkinter
pyglet.font.add_file('file.ttf')

root = tkinter.Tk()
MyLabel = tkinter.Label(root,text="test",font=('font name',25))
MyLabel.pack()
root.mainloop()
于 2020-04-21T21:02:13.657 に答える
7

プラットフォーム固有のハックに頼らずに、外部フォントファイルをTkinterにロードする方法はありません。Tkinterにはそれをサポートするものは何も組み込まれていません。

于 2012-08-16T21:41:27.697 に答える
5

このディスカッションでは、テキスト行を画像として使用し、PILを使用してウィンドウに配置する方法について説明しました。それが解決策かもしれません。

tkFontを使用してバンドルされたフォントをtkFontのマニュアルページにインポートする方法が見つかりませんでした。

于 2012-08-16T19:10:02.583 に答える
2

これは私にとって簡単な解決策でした:

import pyglet, tkinter
pyglet.font.add_file("your font path here")
#then you can use the font as you would normally
于 2020-07-24T23:08:53.517 に答える
1

Linuxの場合、otf持っていたフォントファイルをシステムのフォントディレクトリにインストールできました。

mkdir /usr/share/fonts/opentype/my_fonts_name
cp ~/Downloads/my_fonts_name.otf /usr/share/fonts/opentype/my_fonts_name/

このホームディレクトリが機能していることがわかり、代わりに使用することになりました。

mkdir ~/.fonts/
cp ~/Downloads/my_fonts_name.otf ~/.fonts/

どちらの場合でも、フォント名の文字列を使用してロードできます(すべてのtkinterドキュメントに示されているように):

# unshown code
self.canvas = tk.Canvas(self.data_frame, background="black")
self.canvas.create_text(event.x, event.y, text=t, tags='clicks', 
                        fill='firebrick1',
                        font=("My Fonts Name", 22))
于 2020-11-01T09:14:56.337 に答える
0

tkextrafontは、PyPI上のWindowsおよびLinux用のビルド済みホイールを備えた、最も軽量でシンプルなように思えます。例:

import tkinter as tk
from tkextrafont import Font

window = tk.Tk()
font = Font(file="tests/overhaul.ttf", family="Overhaul")
tk.Label(window, text="Hello", font=font).pack()
window.mainloop()
于 2022-02-28T19:04:40.680 に答える