2020年7月23日木曜日

Ptyhon3で以前のスクリプトを動かす(epsClip)

ドラッグアンドドロップを使った、 こちらで作成したepsファイルの バウンディングボックスを調整するスクリプトをPython3.8で動かしてみた。 新しい環境にGhostScript9.52 をインストールしたが、GhostView は使えなかったのでこちらのスクリプトを 利用する必要があるからである。 Python3.8になったためというより、wxPython や PIL が変更になったためにそのままでは動かなくなったところがある。 環境はWindows10 64bit、python3.8.3、wxPython4.1.0、PIL(pillow)7.1.2である。

まずは、
import Image
でエラーがでる。
これは、このインポートの仕方は廃止されたためで、以前に調べていた。
from PIL import Image
に修正する。

wxPythonでは、wx.EmptyBitmap、wx.EmptyImage、wx.BitmapFromImageが廃止されたようだ。 wx.EmptyBitmap()およびBitmapFromImage()は、どちらもBitmap()に書き換えればよかった。 wx.EmptyImage()は、wx.Image()で書き換える。

wx.Imageの持っていたtostring()メソッドは廃止されたので、tobytes()メソッドに書き換える。

FileDropTargetのOnDropFiles()ハンドラがbool値を返す必要があるようになったので、return True を加える。

文字列のコード変換などで、decode()を用いていたが、そのような必要はなくなった。 文字列は、utf-8となったのでバイト列にするencode()しかない。 また、バイト列には文字列にするためのdecode()メソッドがある。

もともとGUIのみのスクリプトでprintしていないので、print()関数にする修正は不要であった。 これらの修正をすると、問題なくpython3.8で動作した。

2020年7月22日水曜日

Python3.8でIDLEを使ってみた

Python3.8を使いだして、インストールされたIDLEを使ってみた。 Python2.7のときも、ときどき利用していたPythonコードをちょっと書いてみるのに便利な環境である。 JupyterやSpiderよりも手軽に軽快に利用できるので、使い始めるのはよいかと思う。

驚いたのはPython3.8でついてくるIDLEでは行番号の表示ができるようになっていたことである。 メニューからnew fileを選んでエディタを開くと、メニューのOptionsにShow Line Numbersがあり、 それを選ぶと行番号が表示される。 行番号表示をデフォルトにしたい場合は、 メニューのOption/Configure IDLEを選んで、GeneralタブにあるShow line numbers in new windows のチェックを入れればよい。

複数行をまとめてインデントをずらしたいときは、 行を選んでCtrl+[キー(インデントを減らす)とCtrl+]キー(インデントを増やす)でできる。

検索は、Ctrl+Fキーで検索用の窓が開くが、単語を選択したあとにCtrl+F3キーを押すとその単語を探してくれる。 でも検索を頻繁にするなら、慣れかもしれないがVimがやりやすい。

範囲をコメントにするにはAlt+3キー、コメントを解除するにはAlt+4キーである。

シェルのほうでも利用できるが、 TABキーを押すと登録されている単語から候補が表示され、Alt+/キーを押すとテキスト内の単語から候補が表示される。 また、Ctrl+0キーで対応するカッコを確認できる。

シェルでは、Alt+pキーとAlt+nキーで履歴を利用できる。画面でカーソルを移動させてEnterキーを押すとそこにあるテキストが入力行へと転写される。ブロックを用いたコードを実行したときなどに、ブロックごと転写されるため、再編集しやすい。ちょっと動作を確認したいときなどに便利である。タートルグラフィクスで遊ぶのにも便利だろう。

この程度操作ができればちょっとしたスクリプトを書くのに便利である。 なんといってもPythonをインストールするとすぐに利用できるのがよい。 Vimがインストールされていない環境でならIDLEをエディタとして使うのもよさそうである。

python3 wxPythonでドラッグアンドドロップ

これまでPython2.7でwxPythonを用いて、ファイルをドラッグアンドドロップで開くスクリプトを 書いて用いていた。Python3.8を使い始めて、改めてドラッグアンドドロップの部分を抜き出して、 動作を確認してみた。 環境は、Windows10 64bit, Python3.8.3, wxPython4.1.0。

tkinterにくらべて、ウィンドウ作成の部分に手間をかけているが、やっていることは以下の通り。

まず、wx.FileDropTargetを継承したクラスを作成して、 ファイルがドロップされた時に実行されるOnDropFiles()を 自分の望むように書き換える。

さらに、wx.PanelのSetDropTarget()メソッドを用いて、 作成したFileDropTargetを継承したクラスのインスタンスを設定するだけである。 実行すると、ウィンドウが開き、その中に配置されたパネルにファイルをドロップすると、 そのパスがコンソールに表示される。

import wx

class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self):
        super(MyFileDropTarget, self).__init__()

    def OnDropFiles(self, x, y, filenames):
        for n in filenames:
            print(x, y, n)
        return True

class DropPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super(DropPanel, self).__init__(parent, *args, **kwargs)
        self.droptarget = MyFileDropTarget()
        self.SetDropTarget(self.droptarget)
        
class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(MyFrame, self).__init__(*args, **kwargs)
        
        self.panel = DropPanel(self, size=(300, 300))       
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel,  1, wx.EXPAND)
        self.SetSizer(sizer)
        self.Fit()

class MyApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, False)

    def OnInit(self):
        self.frame = MyFrame(None, title=AppName)
        #self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

if __name__ == '__main__':
    AppName = "DnD Test"
    app = MyApp()
    app.MainLoop()  

2020年7月21日火曜日

Python3 tkinterでドラッグアンドドロップ

Pythonのtkinterでファイルをドロップしてそれを開くようなGUIをもったスクリプトを作るのは どうするのか調べてみた。 一つは、ctypes モジュールを用いて、WindowsのAPIを呼び出す方法がある。 もう一つは、TkDNDというTkの拡張ライブラリとそのPythonラッパーであるTkinterDnD2を用いる方法である。 ここでは、後者の方法を試してみた。 環境はWindows10、Python3.8.3、64bit環境である。

まずはこちらにいく。 TkinterDnD2のダウンロードができる。また、TkDND へのダウンロードリンクもある。 行うことは、Tkの拡張ライブラリであるTkDND2.8と、そのPythonラッパーであるTkinterDnD2をインストールすることである。

TkDNDのページへ行く。 64bit環境なら、 Windows Binaries/TkDND2.8の中にある tkdnd2.8-win32-x86_64.tar.gz をダウンロードする。

Python環境がインストールされているフォルダの中にtklというフォルダがある。 それぞれの環境ごとに場所が変わるので、 sys モジュールをインポートして、どこにpythonがインストールされているかを 調べてみるとよいだろう。 そのtklフォルダ中に、tkdnd2.8フォルダをそのまま配置する。

次に、こちらから TkinterDnD2-0.3.zipファイルをダウンロードする。 展開すると、TkinterDnD2フォルダといくつかのdemoファイルおよび 説明のhtmlファイルが得られる。 Pythonがインストールされているフォルダにある、 Lib\site-packagesの中にTkinterDnD2フォルダをそのまま配置すると完了である。

python からdemoを実行してみると動作を確認できる。 簡単なスクリプトは以下のものとなる。 エクスプローラからファイルを投げ込むと、そのファイルパスが表示される。 複数ファイルを投げ入れると、各ファイルパスがスペースで区切られたものとなる。

import sys
import os
import TkinterDnD2 as tkdnd
if sys.version > "3.0":
    import tkinter as tk
else:
    import Tkinter as tk

def drop_enter(event):
    event.widget.focus_force()
    return event.action

def drop_leave(event):
    event.widget._root().focus_force()
    return event.action

def drop_position(event):
    #print(event.x_root, event.y_root)
    return event.action

def drop(event):
    if event.data:
        print(event.data)
    return event.action

app = tkdnd.TkinterDnD.Tk()

app.drop_target_register(tkdnd.DND_FILES)
app.dnd_bind('<<DropEnter>>', drop_enter)
app.dnd_bind('<<DropLeave>>', drop_leave)
app.dnd_bind('<<DropPosition>>', drop_position)
app.dnd_bind('<<Drop>>', drop)

app.mainloop()

2020年7月18日土曜日

MacBook late 2008 にlubuntu20.04をインストールしてみた

MacBook5.1(2008 Late OSX10.5.8)が9年ぶりくらいに電源が入った。 いろいろ試して、最終的にDVDをくわえ込んだまま眠っていたのだが、 9年ぶりに電源が入りDVDを排出した。 OSは、10.5.8 Leopardだったのだが、ブラウザを使ってみるとセキュリティの関係か、 古いブラウザでは開けないページばかりである。 ブラウザを新しいバージョンにしようとしても、10.5.8をサポートしているものは見つからない。 この古いMacBookなら、10.6のSnow Leopardにアップグレードして、 OS X El Capitan までアップグレードしていく人が多いようである。 しかしながら、わざわざアップグレードしていっても、最新ではない。 古いPCなので、軽量のLinuxディストリビューションを入れて使うのがよさそうと考えた。

軽量のLinuxディストリビューションは、いくつもあって迷うところであるが、 多くのドライバが用意されていそうなUbuntuで軽量のディストリビューションということで、 Lubuntuにした。最新は、20.04であったので、そちらのISOをダウンロードし、 Etcherという起動USBを作成するソフトウェアで、Lubuntuインストール用のUSBキーを作成した。 MacOSとのデュアルブートやrEFindについてなど、検索するといろいろでてくるが、とりあえずUSBキーで起動してみた。 もうMacOSを利用するつもりもないので、シングルブートでインストールしてみる。 USBキーで起動して、普通にインストールするだけである。 パーティションは、MacOSのパーティションを削除し、デフォルト設定でインストールした。 インストーラーはわかりやすいので、迷うところはない。

インストール直後は、wifiのドライバがインストールされていないが、 このMacBookはEtherポートがあり、それが利用できたため、ネットに接続できた。 そのあとで、lubuntuのメニューから(設定>Additional Drivers)を開くと、 ドライバが探されてwifiとnVidiaのドライバをインストールすることができた。

日本語の入力は、
sudo apt install fcitx-mozc
sudo apt install font-noto font-noto-cjk-extra font-noto-color-emoji
その後、(設定>入力メソッド)でfcitxを有効にした。
日本語を入力するときは、Ctrl+Spaceを押すとMozcに切り替わった。

タッチパッドのタップでクリックしたいので、
/etc/X11/xorg.conf.d/30-touchpad.conf
を以下の内容で作成した。

Section "InputClass"
  Identifier "touchpad"
  Driver "libinput"
  MatchIsTouchpad "on"
  Option "Tapping" "on"
EndSection
指一本タップで左クリック、 二本タップで右クリック、 二本指でスワイプするとスクロールするようになった。 スワイプでのスクロールの向きは、 (設定>LXQt settings>キーボードとマウス>Mouse and Touchpad) でNatural scrollingをトグルすると変更できた。

ウィンドウタイトルなどに使われる文字のフォントサイズは、 (設定>LXQt settings>Openbox設定マネージャー) で行った。 デスクトップアイコンのラベルの大きさは、 (設定>LXQt settings>デスクトップ) で、ラベルテキストのフォントサイズで設定した。

Lubuntu 20.04では、python3.8.2がインストールされていた。 pipやtkinterは、aptを用いてインストールした。
sudo apt install python3-pip
sudo apt install python3-tk

ついでに、pythonで起動するように.bashrcに、
alias python='python3'
alias pip='pip3'
を追記した。

OSもブラウザも最新のものが利用できるようになり、 速度的にも軽快に利用できている。 サスペンドおよびサスペンドからの復帰はできた。 しかし、ハイバネーションは機能していない。 古いPCは、軽量LinuxのLiveUSBで起動してみて、 使えそうならLinuxで利用するのもよさそうである。