トップページ
解説ページ
作成メモ(このページ)
ubuntu23.10をクリーンインストール後、pipの挙動がvenv仮想環境が標準になった(なっていた?)ことが分かり、必要なパッケージのインストールで
右往左往しているときにsozoku_svgのバグ(保存しなければ正常に終了できなくなっていた)を見つけたので修正。v0.7.2.10(2024.5.2)
-
配布ファイル形式にpythonの配布ファイル形式であるsdist形式を追加した。2022.11.7
数年前と比べればPythonの知名度が相当上がった?ので、そろそろOS毎の実行形式ファイルは不要な気もします。
今後配布することがあればはsdist形式のみにしようかと思うこの頃です。
-
相続関係者の氏名やメモ書きで全角スペースを使えるようにした 2020.7.30
0.7.02.08版から実行形式は64bitのみアップ。32ビットであればどのWindowsでも動作すると思っていたけど、Windows10には通用しない
ようなので、この際、主流の64ビットに絞った。
-
相続関係者の氏名で姓と名をスペースで分けようとしたら2行になる 2020.7.30
どうして気づかなかったのだろう、姓と名をスペースで区切るのはよくあることなのに。文字列を.split()で分割する際に指定してなかったから
改行もスペースもタブも一緒くたに分割されているようだ。
-
Windows用の実行形式ファイルについて 2020.7.30
Windows用の実行形式ファイルは32ビットXp環境でフリーズしたものをアップしていたが、64ビットWindows10ではライブラリの関係で
動作しないことが分かった。これに限らず64ビットWindows7では動作するけどWindows10には通用しないってのが多いような気がする。
(Windows8は未確認)64ビットWindows10環境でフリーズした実行形式をアップ。当然、64ビットWindows10環境でなければ動作しません。
-
日本語入力ON/OFFの自動切替えについて 2019.4.9
Linux環境で相続人諸元の入力ダイアログで日本語入力のON/OFFをやぼったい方法で切替えるようにしたつもりだったけど
ごく限られた環境でしか機能しないことが分かった。Fcitx+Mozcの環境でしか機能しない。Ubuntuで推奨されているIBus+Mozcの
環境では全く機能しない。LinuxといってもUbuntuでしか確認していないので、他のLinux環境ではどうなるのかさっぱり
分からない。
-
相続関係図の使用フォントの変更に関する修正 2019.3.26
相続関係図の使用フォントを変更すると、ダイアログなどのラベルフォントまで変更されていたのを修正。
その他:実行形式ファイル(ファイル群)を作成する際、ubuntuではpyinstallerで、Windowsではcx_freezeを使っているけど
できればpyinstallerで統一したい。その方が簡単だから。でも、Windowsでpyinstallerを使うと成功したように見えるけど、
実行すると有効なW32アプリケーションじゃないと叱られる。
-
python3.6.3でスクリプトを実行する際にトラブル発生 2018.4.18
python3.6.3の環境でスクリプトを実行するとcanvasvgパッケージのインストールを促すメッセージが
表示される。もちろん、canvasvgパッケージはインストールされている。pythonのインタラクティブシェルで
canvasvgをインポートしてみるとtkinter関連のエラーが発生していて、python3-tkをインストールするよう
メッセージが出ている。
ubuntu環境なのでsudo apt install python3-tkでインストールして、再度実行すると今度は正常に起動できた。
python3.6.3のパッケージングのバグか、それともtkinter外しの前兆か。
なお、このトラブルは端末等からpython3 sozoku_svg.pyでスクリプトを起動する場合のことで、
実行形式を使う場合はこの限りではありません。
-
macOS上での実行とスクリプト修正 2017.12.5
バージョン0.7.02.05 --> 0.7.02.06
macOSでの動作テストの結果、macでのマウス右ボタンの番号が2であることがわかった。(Win,Linuxでは3)
また、シートのデフォルト背景色が白色に近いため、マウスポインタと重なったときのメモの色と区別しにく
くなることがわかった。この2点を修正した。
メモ入力時のIME制御についてエラーが発生していたので修正した。
macOS上での実行について
今のところmacOS用の実行形式ファイルは作成できていないので、macOSではpython3や追加モジュール等を
インストールする必要がある。しかし、macOSでpython3をmacのパッケージ管理システムであるhomebrewを
使ってインストールするとmac上での動作が不安定なバージョンのTcl/Tkとリンクされてしまう。(テストでは
8.5.9のバージョンとリンクされた)そのままではsozoku_svgスクリプトは正常に動作しないので、
・ActiveTclのサイトから安定版のActiveTcl8.5.18をダウンロードしてインストール
・python3を一旦削除
・homebrewを使わずpython.orgのサイトから正統なpython3をダウンロードしてインストール
する必要がある。
その他、macOS上で実行する場合、スクリプト内で日本語を入力する際に未確定の日本語入力文字が見えない
という現象が発生している。ドロップダウン上の変換候補は見えるので何とか入力できるが今のところ
解決の方法がない。mac上では他のOSの仮想環境を作った方がいいかも。
-
svgからpdfへの変換 2017.10.31
ネット情報でsvglibとreportLabのモジュールを使えばsvgをpdfに変換できるとあったので試してみたが、
変換後のpdfで日本語がすべて■で表示されていた。rsvglibがsvgをreportLab用のオブジェクトに変換して、
reportLabがpdfに変換するという流れのようで、reportLabモジュールは日本語を扱えるばずなのでsvglibが日本語
非対応なのではないか。
svgからでなくても内部でtkinterのcanvasオブジェクトをreportLabのcanvasオブジェクトに変換すればいいのだと思うけど、
考えただけでぞっとする作業なので一応最後の手段ということにして別の方法を検討。
-
Linux用(ubuntu14.04で確認)の実行形式ファイルを作成 2017.10.29
cx_FreezeではUbuntu環境の実行形式ファイルを作成できなかったが、pyinstallerで作成できた。実行形式と
いってもWindows用と同様にpython本体と一緒にフォルダに固めたもの。Linux環境ではデフォルトでpythonが
インストールされていると思うけどまだ主流の2.7だと思うので、この実行形式を使えばわざわざPython3を
インストールする必要がない。
ところで、Windows用の実行形式を作成したcx_Freezeはsetup.pyを作成する必要があったが、setup.pyの書き方で
少なからず悩んでしまった。その点、pyinstallerはsetup.pyを必要とせず、スクリプトを調べて
importすべきモジュールなどを自動でかき集めてくれるのでとっても簡単。いっそのこと、Windows用の
実行形式をpyinstallerで作成し直そうかと思ったりする。
-
Windows用の実行形式ファイルを作成 2017.10.25
バージョン0.7.02.04 --> 0.7.02.05
Windows用の実行形式ファイルをcx_Freezeで作成した。
実行形式と言ってもPython本体と関連モジュールをフォルダで一まとめにして、スクリプトの実行形式(exe)と
一緒に詰め込んでいる感じ。不要なモジュールも入っていると思けど全体で20MB程度に収まっているのでよしとする。
Pythonをインストールしていない環境でも適当なところに解凍して中のsozoku_svg.exeを実行すれば起動するので確かに便利。
ただし、今のところスクリプト本体で出力できるのはSVG形式だけなので、PDF出力するためにはInkscapeなどの外部プログラムの
インストールが必要。適当なモジュールを取り込んでスクリプト本体で直接PDF出力できるよう検討したいと思う。
なお、cx_Freezeで作成した実行形式ファイルの動作の関係で外部モジュールのチェック方法とsozoku_svg本体プログラムの
所在確認方法を変更した。元は外部モジュールのチェックをパッケージリストを取得して行っていたがcx_Freezeで
固めた環境では上手く取得できないようなので直接importして存在確認するように変更した。また、sozoku_svgプログラム
本体の所在を__file__で取得していたが、cx_Freezeの環境の場合はsys.executableから取得するように変更した。
※Windowsで実行するとフォントが美しくないのはなぜだろう。気のせいか…
-
不具合を修正 2017.10.23
バージョン0.7.02.03 --> 0.7.02.04
Linux以外の環境で実行する場合のメニュー操作の不具合を修正
-
ホームページのサンプル動画の変更とスクリプトの変更 2017.10.17
バージョン0.7.02.02 --> 0.7.02.03
スクリプトの変更はメッセージ関連とスクリプト内のバージョン表示の修正
-
不具合を修正 2017.10.15
バージョン:0.7.02.01 --> 0.7.02.02
メモが正常にUndoされていなかった。インスタンスを=で単純にコピーしても同じ実体への参照が増えるだけというPython特有のバグ。
-
不具合を修正 2017.10.6
バージョン:0.7.02.00 --> 0.7.02.01
行・列削除に伴うBox連動メモの削除のUndoの際に連動情報がUndoされていなかった。また、連動メモ⇔通常メモ間の変更のUndo
処理においても連動情報が正常にUndoされていなかった。まだまだバグは潜んでいる模様。
Boxに連動メモがある場合、Boxを移動すると同じ距離だけ連動メモも移動するが、メモの移動先に他のBoxがあると、移動したメモが
そのBoxの下に隠れてしまう場合がある。また、Box移動において連動メモが元のBoxエリア内に入った場合、Boxをドラッグして
元に位置に移動させることができないので、元の位置に戻すためには取り消し(Undo)を利用する。
-
Box連動メモについて 2017.9.30追加
バージョン:0.7.01.00 --> 0.7.02.00
メモをBoxに連動できるように変更した。Box連動メモを作成する方法は2つ。1つは、既存のBoxを右クリックして表示される
ポップアップメニューから 「連動メモ追加」を選択して、連動メモとしてメモを作成する方法。もう1つは、既存のメモの
ポップアップメニューから「連動メモに変更」を選んで連動させたいBoxをクリックで選ぶ方法。なお、対象のメモがすでに
連動メモである場合は、ポップアップメニューは「通常メモに変更」というメニューになる。ちなみに、メニューバーの
「Memo追加」で作成されるメモは通常メモだけである。
Boxには複数の連動メモを追加できるが、1つのメモが連動できるBoxは1つだけである。 連動メモは連動するBoxの移動や
削除によって、一緒に移動し又は削除される。ただし、連動メモを個別に移動、削除しても、Boxは移動も削除もされない。
連動メモを作成中、元になるBoxやMemoの表示色を変更するようにしている。連動メモを作成中にキャンセルする場合は
<ESC>キーを押す。その他、連動メモ作成中にメニューバーをクリックすることでキャンセル扱いにしている。
動作の変更::連動メモ作成時と同様に、Line作成時、2つ目の接続先の指定を待っているときにメニューバーを
クリックするとLine作成をキャンセルするのと同じ扱いとした。
-
分割印刷用PSファイルについて 2017.8.20追加:
LinuxでInkscapeとposterがある場合に分割印刷用PSファイルを出力できるようにした。posterコマンドは小さなデータを
大きく拡大出力するためのコマンドなので使い方としては邪道と思う。SVGやPDFに出力して1枚の用紙に印刷して読みづらいと
感じたら分割を検討するという流れ。
分割用紙はA4用紙に固定した。プリンターによってサポートする用紙サイズが異なるので、用紙種別を取得しようとすると
PythonのCUPSモジュールで接続しているプリンターを取得して、その後そのプリンターがサポートしている用紙サイズを
取得してという作業になると思うけど、そこまでコル必要はないような気がするというか、ちょっと腰砕け。
また、PS出力ができるとLinuxのlprコマンドで印刷できるのでメニューに印刷を加えてもよかったけど、これもLinuxだけの
メニューになるのであえてメニューには入れなかった。なお、Windowsの場合、PDF出力すればAcrobatoReader(V9以降)で
分割印刷できる。
-
SVG出力後の印刷方法について(その3)2017.7.18追加:
Linux(ubuntu)環境でプリンター名を取得する方法としてpythonのpycupsモジュールが使えそう。インストールしようとしたら
pycupsでは該当がないと言われた。ググってみるとモジュール名は単にcupsだった。aptでpython3-cupsでインストール。
バイナリモジュール。概要はIDLEでhelp(cups)で確認。サンプルスクリプトの要領でプリンター名も取得できたので、予定どおり
sozoku_svgに組み込む方向で検討。ただし、Unix系OSのみ。
WindowsのPythonでcupsのインストールを試みた(pip)。モジュール名はpycupsでヒットしたが、インストール段階でエラー
(コンパイル作業でVisualCが必要)が発生してストップ。それ以上は未確認。
-
SVG出力後の印刷方法について(その2)2017.7.16追加:
私の環境(ubuntu)では、Inkscape経由で作成したEPSをposterコマンドに渡して複数ページを持つPSファイルを作成し、それを
lprコマンドでプリンターに流せば分割印刷できた。なので、今後、Inkscapeとposterがインストールされている環境(Ubuntu等の
Linux環境)で分割印刷用のPSファイルを出力できるようにする予定。また、lprコマンドに渡す出力先のプリンター名を取得する
方法が分かれば直接印刷も実現できそう。
posterとよく似たコマンドでPythonで作成されたpdfposterというコマンドもあったが、次のようなことでイマイチだった。
PDFを複数ページを持つPDFに分割できてAcrobatReaderの代わり(現在Linux用のAcrobatReaderは提供されていない)に使えそう
なんだけど、Boxに背景色を残したままのPDFを渡すとページ全体のバックグラウンドが塗りつぶされてしまう(Box背景色を白に
統一したPDFなら問題は起きない)。それと切り貼りに重宝するトンボが出力されない(Posterはトンボが出力される)。
Windows環境ではSVGをInkscape等でPDFにさえすればAcrobatReaderで分割印刷できるし、プリンターメーカーから提供されている
プリンタードライバでポスター印刷がサポートされているので分割印刷に困ることはないと思っている。
-
Windows環境でのメニュー表示:
モードメニューを操作したとき、メニューの文字や背景の色を変更するようにしているが、Windows環境ではメニューの色設定が
反映されない。Windows特有の制約なのか、マウスホイールの扱いのようにWindows特有の記述が必要なのかよく分からない。
-
SVG出力後の印刷方法について:
出力されたSVGやPDFをInkscapeやGIMPなどで印刷すると全体を用紙1枚に印刷しようとする。簡単な図解表ならそれでもいいが人数の
多い説明図を1枚に収めてしまうと小さすぎて判読不能になる場合がある。プリンタードライバ側でポスター印刷等の機能があれば
分割印刷することができるが、私が使用しているプリンターの場合、Linux用に作成されたドライバーにはポスター印刷機能が見当
たらない。ちなみに、Windows用のドライバーにはポスター印刷を目的とした分割印刷の機能があったので印刷することは可能だったが、
あくまでポスター印刷することを目的とした機能なので、大きなサイズの図を印刷用紙サイズで分割するイメージではない。
その点、PDF形式であればAcrobatReaderで分割印刷することも、ポスター形式で印刷することも可能。ただし、Ver9以前では分割等の
機能はない。
Ubuntu環境では「画像」を分割して複数のPDFを出力するプログラム(PosteRazor)とEPSを分割してPS出力するプログラム(poster)
があるが、後者のプログラムを使うことにした。posterというコマンドラインツールだが、出力する用紙サイズ(例えばA4)と、
作成したい用紙サイズ(例えばA0)を指定して>で受けると複数ページのPSファイルができるので、GIMPやドキュメントビュアーで
開いて各ページを印刷すればOK。トンボもついているので貼り合わせやすい。ただし、両方共ポスター印刷が目的のプログラムなので、
原寸大を印刷用紙サイズで分割するイメージではない。ちなみに、PosteRazorはGUIだったが日本語非対応でファイル名が文字化け
していた。ネット情報ではopenofficeならPDFを読み込んでページサイズで分割して印刷できるそうだ。ちなみにWPSではPDFは読み
込めずSVG(XML)は単なるテキストファイルの扱いだった。ブラウザでも表示できるが、印刷は用紙1枚を超える部分は印刷されな
かった。いっそのこと、出力したSVGをInkscapeで大きなサイズの画像に変換して、Gimpで印刷すれば分割してくれるのでは?
-
Tkinterのバージョンによって、メソッドの戻り値がリストだったものがタプルに変更されているものがある。Tkinter8.5のマニュアル
ではcamvas.find_withtag()の戻り値はリストとなっているが、現行(Tkinter8.6)ではタプルに変わっている。新しいTkinterの
マニュアルがほしい。
-
スクリプトの存在するディレクトリ:
スクリプトの存在するディレクトリとしてIDLE環境でos.path.dirname(__file__)を使っていたが、これは相対パスだった。
端末からPython3で起動した場合にはまともに動作しなくなる。絶対パスはos.path.abspath(os.path.dirname(__file__))でなけれ
ばならない。
-
canvasvgモジュール:
このモジュール内でSVGファイルへの書き出しを単にopne(filename,'w')としている。日本語版LinuxなどではUTF-8での書き出しが
基本となっているので問題ないが、日本語WindowsではそれがSJISで書き出されてしまう。svgファイルはXMLだが、XMLではUNICODEが
基本らしく、日本語Windows環境で出力したSVGファイルをブラウザなどで開くと日本語(SJIS)の部分でエラーとなる。
やむなくcanvasvgモジュール内の関数をencode指定するように変更した。
-
Pythonのマイナーバージョンの変更は実行に影響する:
canvas.coords(id,[座標リスト])によってidのオブジェクトを新しい座標で再描画しているが、Python3.4と3.6では座標データの
与え方に違いがある。座標リストをcoordslistとするとPython3.6ではcanvas.coords(id,coordslist)で動作するが、Python3.4では
エラーになる。canvas.coords(id,*coordslist)でなければならない。3.6より3.4が規則に厳格であるということだと思うが、
こういうところは3.6でも規則に厳格であって欲しかった。マイナーバージョンまで動作確認の必要があると結構厳しいものがある。
-
リストや辞書の振る舞い:
いまさらながら驚いた。「リスト」や「辞書」などの変更可能な変数は、単なる実体への参照なので、例えばa=[1,2,3]として
b=aとすると。a,bともに同じ実体を参照することになる。そのため、a[1]=4とすると、実体が[1,4,3]になり、それを参照するbも
[1,4,3]になる。それは辞書でも同じ。それを避けるためにはtupleなどの変更不可能な変数を使うしかない
かcopyモジュールで正式にオブジェクトをコピーするしかない(※2017.7.18修正)。
-
関数定義における引数:
def func(arg,*args):と定義するとargの引数は必要だが、その後の引数は0個以上任意に渡せる。
def finc(arg=None,*args):と定義すると、最初の引数も不要になるが、argsに引数を渡すためにはargに何らかの引数を渡す必要が
ある。Noneを渡してもよい。
2017.7.21追加:ちなみに、関数呼び出しの際の引数として*を付けた配列名を渡す意味は、単に配列を展開して渡すという意味なので
関数定義の際の*argsとは全く関係がない。
-
IDLEオートインデント:
IDLEでオートインデントがうまく動作しないときは、それより上の行で()や[]の過不足がある。
-
canvas.tag_bindで今更ながら気づいたこと:
クラスの中で.tag_bind(,\,self.call_back)でバインドを設定する際、共通するtag名で設定すると、
最後に作成されたインスタンスのcall_backが共通するtag名のオブジェクトのcall_backとして呼び出しされる。オブジェクト毎に
個別の動作をさせるためには、必ず一意のtagorIDを設定すること。
-
WindowsでのIME制御:
Linux上のPythonで実行するために作ったのでWindows対応はそこそこでいいと思っている。LinuxでのIME制御もキーコード送信という
泥臭い対応だがWinodwsでも同じような対応となる予定….その予定だったが、実際にWindows環境でダイアログを使ってみると、
ダイアログ内で一旦IMEをONにすると別のエントリーに移動してもIMEの状態が継続されるようなので、Windows環境ではIME制御を
しないことにした。元々、Ubuntu上でエントリーを移動する度にIMEをONにすることが煩わしかったのでIME制御の必要性を感じたの
であって、Windows環境でその煩わしさがないのなら制御の必要もないってことで。
-
実行時での注意:
・その1
#IDLE環境で実行する場合は
from tkinter import * #これだけでfontもsimpledialogも使えるが、
端末から実行する場合は
from tkinter import *
from tkinter import font
from tkinter import simpledialog #明示的にimportしないと使えない。
・その2
コントロールに表示する文字列はubuntuでちゃんと表示できていてもwindows上では文字がコントロールからはみ出す。ボタンに日本語を
表示する場合、ubuntuではwidthに日本語文字列の文字数を与えればちゃんと収まるが、windowsでは半角での文字数を与える必要がある
ようだ。だから全角文字数×2となる。
・その3(解決済み)
端末から実行するとLinux上のIME制御のとき
Unable to resolve keysym for 'Space' のメッセージがその度に出力される。
Popen時にstdinの他にstdout,stderrにもPIPEを渡すことでメッセージを取り込むことができた。
-
ユニコード:
Pythonで使う日本語の文字列にu'xxx'という風にユニコードを明示的に指定をしようとしたが、Python3では文字列はユニコードが標準となったので明示的に指定する
必要がなくなった。
-
Pythonの参照渡し:
Pythonの関数への引数はすべて参照渡しであると説明されているが、引数で渡される変数が変更不可の型である場合は、関数内での引数の変更は元の変数に反映されない。
変更不可の型:タプル、文字列、数値など。変更可能な型:リストなど
-
canvas.tag_bindであれっと思ったこと:
全く異なるクラス内に同じ名前のメソッドがあって、それぞれ別のクラスの右クリックイベントのコールバックだったが、なぜか新たに作成したクラスではイベントを
捕捉できなかった。まさかと思ってコールバックになっているメソッドの名称を変更したらすんなり捕捉できた。クラス内のメソッドをクラス内から呼び出しているだ
けだから、そんなことはありえないはず。→わかった!同一クラス内に同じ名前のメソッドが2つあったのが原因だった。バカバカしい。でも、クラス内に同じ名前の
メソッドが2つあってもエラーにならないなんて…
-
印刷について:
SVG形式で出力したデータの印刷はInkscapeなど他のアプリケーションを使うことになる。イマイチ面白くないので調べてみたら直接印刷するためにはCUPSにPS形式の
データを流してやる必要があるらしい。SVGをPSに変換するためのPythonモジュールを探してみたが見当たらない。canvas.postscript()でPS出力ができないなら、
直接PSファイルを作成できないか調べてみたが、作図はともかく日本語フォントの扱いがghostscriptと同じように極めてマニアックで断念。やはり、マルチバイト文字圏の
国は世界から疎外されている。誰か世界的にも超有用でしかも日本語しか受け付けないシステムとアプリを作ってくれないか。
※SVG->Inkscape->PS->printer?
-
svg:
webページに表示するベクター図形を作成する規格みたいで、pythonにもcanvasvgモジュールがある。(pythonはたいていのモジュールが揃っていて本当にすごいと思う。)
このモジュールのメソッドsaveallでまずファイルに書き出し。
saveall(filename, canvas, items=None, margin=10, tounicode=None):saveallから呼び出しされているconvert(document, canvas, items=None, tounicode=None)
試してみたが、日本語文字列は確かに表示されるが縦書に配置していたのに横書きに表示される。しかし、canvas.postscript()もPILも使いものにならない中、
少なくともSVGでは日本語が表示されているので、現状ではこれが唯一の外部出力への道。縦書表示用のマルチライン文字列を改行で分割して行ごとに位置決めして出力
する方法に変更すると一応希望どおりの出力のSVGファイルが得られた。
次にSVGファイルからPDFに変換したかったので次の2つを試したがいずれもダメだった。
①CairoSVGモジュール:インストールそのものに問題があって試すことすらできなかった。
②Svglib + reportlab:pip又はapt-getでとりあえずインストールできた。しかし、ネットで紹介されているスクリプトを実行してもエラーが発生してPDFへの変換は
できなかった。それに、外国ツール特有の日本語非対応問題があるような記事も見たような気がする。従って、現状ではSVG形式への出力で一応の決着としたい。
今後、正常に動作するモジュールが発見されたらPDFの出力まで行うようにしたい。ちなみに、SVGはWEBブラウザや画像編集ツールで開くことができるので、そちらで
印刷すればよいであろう。また、画像編集ツールでPDF形式に変換できるものもあるので手作業になるがPDFは得られる。GIMPは設定がよくなかったのか、多少ボケたPDF
になったが、Inkscapeは綺麗なPDFの出力が得られた。
-
PIL:
Python Imaging Library を使えばよく似た文法で作成したイメージをイメージファイルに出力できるらしい。しかし、本家のPILは尻すぼみで今は後継のPillow
というモジュールが開発を続けている。本家はPython3に未対応だが、後継はPython3に対応済み。もともとWindowsやMacOS向けのモジュールのようだ。Ubuntuなど
LinuxのメジャーにはPILモジュールが含まれているらしいが、本家のPILとは共存できないのでPillowをインストールする前に本家を削除する必要がある。ままよ。
python2.7 & python3にapt-get install でpillowを導入。pillowのバージョンが新しくないので縦書に重宝するmultiline_textメソッドがない。やむなく、
行ごとに出力するようにした。→確かに日本語表示は可能になるが、いわゆるラスタ画像の出力なので印刷はお世辞にも綺麗とは言いがたい。
-
PS/PDFへの出力が大問題:
--nostringval-- <フォント名>
canvas.postscriptメソッドでPSファイルに出力して、そのファイルをPDFに変換する予定だったけど、PDFに出力されない。その前段階のPSファイルも出力されて
はいるが正常なファイルかどうかも分からない。PSファイルを扱えるアプリで開こうとしても正常に開けない。端末でps2pdfを使ってPSファイルを変換してみると、
エラー表示などからどうも日本語の扱いでトラブっているらしい。文字のない図形だけのPDF出力は得られる。
ghostscriptに使用する日本語フォントを認識させてやる必要があるみたいで、いろんなサイトでいろんな記載があったが、結局、本家のGhostscript.comのフォントの
扱いに関する記述でほぼ網羅されているようだ。たぶん、Ghostscriptの設定をちゃんとできれば日本語を含むPSファイルの作成ができると信じたいが、いかんせん
Ghostscriptの設定が面倒過ぎる。何回かトライしたが全くわからない。愛知大学(と思われる)のブログでtcl/tk側のプログラムにパッチを当てる必要があるような
記載もあるし、仮にできたとしてもこんな設定を一般ユーザーがするわけがない。残念ながらcanvas.postscriptメソッドでのPS出力は諦めるしかない。
-
IME制御(自動ON)への取り組み:
エントリーに日本語を入力する際に「半角/全角」キーなどを押して日本語のIMEをONにするが、複数の入力欄がある場合、それぞれのエントリー毎に
「半角/全角」キーを押す必要がある。面倒なのでエントリーがアクティブになったら自動でIMEをONにしたい。
Pythonは日本であまり普及していないためか、この辺りの処理はあまり紹介されていない。調べてみたところ、evdevモジュールの利用と、xautomationを
システムにインストールした上でxteとかいうコマンドを利用する方法。ただし、Linux環境でのことで、Windowsはsendkeysコマンドや他の方法もあるはず。
最初にevdevモジュールを試してみたが、「/dev/inputを書き込みモードで開けない」という意味のエラーが出た。/dev/inputの書き込み権限の問題の可能性
もあるとの記事があったのでchmodで権限を緩めてみたが結局同じエラーで先に進めなかった。
次に、xautomationとxteの方を試した。python3はbufferに文字列を書き込めないのでbyte型に変換する必要があったが、一応機能することがわかった。
ところがxteが対応するキーには「半角全角」キーが含まれていなかったので、苦肉の策としてMozcの設定で直接入力時のIME有効化のキーを追加することに。
→「Ctrl+space」。LinuxではこれがIME起動キーの標準だったと思う。ちなみに、IME有効化している時のIME無効化のキーとしては追加しなかった。
その結果エントリーがアクティブになる時ののイベントに引っ掛けてIMEの有効化はうまくいったが、一旦IMEが有効になったエントリーから出て再度
アクティブになったとき、IMEの状態が維持されていることがわかった。アクティブになる度に同じ処理をするとせっかく有効になっているIMEモードを無効化
してしまうことになるのでIMEの状態取得ができないか調べたがだめだった。やむなく、一旦IME有効化したエントリーは再度アクティブになっても有効化の処理を
せずユーザーに任せることにした。
-
フォントファミリーの一覧はtkFont.families()で取得する。
from tkinter import *
from tkinter import font
root = Tk() #Tk()でWindowを作成した後でないとフォント一覧は取得できない。
font.families() #インストールされているフォント一覧はタプルで返される
-
イベントを関数やメソッドにバインドする際、callback関数やメソッドの名前をcommand=で指定するが、関数等のつもりで()を付けてしまうと
それ自体はエラーにはならないが、全く関係のないところで理解不能のエラーが生じることがある。
|