2022/04/05(火) [n年前の日記]
#1 [python] tkinterとPillowでウインドウサイズに画像サイズを合わせる
Python + tkinter + Pillow で、ウインドウサイズ(キャンバスサイズ)に画像サイズを合わせて表示する処理を試しているところ。ついでにスクロールバーもつけてみたりして。
動作確認環境は以下。
参考ページは以下。ありがたや。
_【Python/tkinter】Canvasに画像を表示する | イメージングソリューション
_Pythonの文法メモ: 【Pillow】ImageOpsモジュールによる画像拡大縮小・トリミング・パディング
_Tkinterの使い方 : スクロールバー(Scrollbar)の使い方 | だえうホームページ
自分の手元でも、たぶんできた。一応動いてるように見える。
_03_canvas_zoom2.py
使用画像は以下。
_tex_1024.png
py 03_canvas_zoom2.py で実行すると、以下のような感じで動いてくれた。
ImageOps.pad() で、パディングを考慮したサイズに変換してくれるので簡単。method=Image.LANCZOS を渡せば、Lanczos で変換してくれるようでもあるし…。Pillow は便利だなあ。ありがたや。
でも、画像表示に特化した処理を ―― キャンバスに画像を表示できて、スクロールバーがついてて、拡大縮小表示ができて、マウスドラッグでスクロールができる、みたいなクラスだかモジュールだかを誰かが既に書いてたりしないのかなという疑問も湧いた。何かの処理結果画像を画像ビューアっぽい感じで表示したい場面って結構あるのではないだろうか。毎回こんな感じのスクリプトを書かなきゃいけないのだろうか…。
動作確認環境は以下。
- Windows10 x64 21H2 + Python 2.7.18 32bit + Pillow 6.2.2
- Windows10 x64 21H2 + Python 3.9.12 64bit + Pillow 9.0.1
参考ページは以下。ありがたや。
_【Python/tkinter】Canvasに画像を表示する | イメージングソリューション
_Pythonの文法メモ: 【Pillow】ImageOpsモジュールによる画像拡大縮小・トリミング・パディング
_Tkinterの使い方 : スクロールバー(Scrollbar)の使い方 | だえうホームページ
自分の手元でも、たぶんできた。一応動いてるように見える。
_03_canvas_zoom2.py
try: # Python 3.x import tkinter as tk except Exception: # Python 2.7 import Tkinter as tk from PIL import Image, ImageTk, ImageOps class App(tk.Frame, object): def __init__(self, master=None): try: # Python 3.x super().__init__(master) except Exception: # Python 2.7 # tk.Frame.__init__(self, master) super(App, self).__init__(master) self.master.title("Canvas sample") # self.master.geometry("512x512") self.rootfrm = tk.Frame(self.master) self.rootfrm.pack(expand=1, fill=tk.BOTH) self.rootfrm.rowconfigure(1, weight=1) self.rootfrm.columnconfigure(0, weight=1) # create Button self.btnfrm = tk.Frame(self.rootfrm) self.btnfrm.grid(row=0, column=0, sticky=tk.W) self.btn0 = tk.Button(self.btnfrm, text="Fit", command=lambda: self.set_zoom_fit()) self.btn0.pack(side=tk.LEFT, padx=4, ipadx=8) self.btn1 = tk.Button(self.btnfrm, text="1:1", command=lambda: self.set_zoom_full()) self.btn1.pack(side=tk.LEFT, padx=4, ipadx=8) # create Canvas self.cvsfrm = tk.Frame(self.rootfrm) self.cvsfrm.grid(row=1, column=0, sticky=tk.N + tk.S + tk.W + tk.E) self.cvsfrm.rowconfigure(0, weight=1) self.cvsfrm.columnconfigure(0, weight=1) self.canvas = tk.Canvas(self.cvsfrm, bg="#666666", width=512, height=256) self.canvas.grid(row=0, column=0, sticky=tk.N + tk.S + tk.W + tk.E) # create Scrollbar xbar = tk.Scrollbar(self.cvsfrm, orient=tk.HORIZONTAL, command=self.canvas.xview) ybar = tk.Scrollbar(self.cvsfrm, orient=tk.VERTICAL, command=self.canvas.yview) xbar.grid(row=1, column=0, sticky=tk.W + tk.E) ybar.grid(row=0, column=1, sticky=tk.N + tk.S) self.canvas.config(xscrollcommand=xbar.set) self.canvas.config(yscrollcommand=ybar.set) # set drag scroll self.canvas.bind("<ButtonPress-1>", lambda e: self.canvas.scan_mark(e.x, e.y)) self.canvas.bind("<B1-Motion>", lambda e: self.canvas.scan_dragto(e.x, e.y, gain=1)) self.zoomfit = True self.im = Image.open("tex_1024.png") self.set_image() def set_zoom_fit(self): self.zoomfit = True self.set_image() def set_zoom_full(self): self.zoomfit = False self.set_image() def set_image(self): self.update() cw = self.canvas.winfo_width() ch = self.canvas.winfo_height() if self.zoomfit: # view fit self.im_pad = ImageOps.pad(self.im, (cw - 4, ch - 4), method=Image.LANCZOS) self.photo_image = ImageTk.PhotoImage(image=self.im_pad) else: # view 1:1 self.photo_image = ImageTk.PhotoImage(image=self.im) self.canvas.create_image(0, 0, image=self.photo_image, anchor=tk.NW) # set scroll region iw = self.photo_image.width() ih = self.photo_image.height() region = (0, 0, iw, ih) self.canvas.config(scrollregion=region) def main(): root = tk.Tk() app = App(master=root) app.mainloop() if __name__ == '__main__': main()
使用画像は以下。
_tex_1024.png
py 03_canvas_zoom2.py で実行すると、以下のような感じで動いてくれた。
ImageOps.pad() で、パディングを考慮したサイズに変換してくれるので簡単。method=Image.LANCZOS を渡せば、Lanczos で変換してくれるようでもあるし…。Pillow は便利だなあ。ありがたや。
でも、画像表示に特化した処理を ―― キャンバスに画像を表示できて、スクロールバーがついてて、拡大縮小表示ができて、マウスドラッグでスクロールができる、みたいなクラスだかモジュールだかを誰かが既に書いてたりしないのかなという疑問も湧いた。何かの処理結果画像を画像ビューアっぽい感じで表示したい場面って結構あるのではないだろうか。毎回こんな感じのスクリプトを書かなきゃいけないのだろうか…。
[ ツッコむ ]
#2 [pc] Bluetoothカセットアダプタが気になってる
MZ-700関係のアレコレをググっていたら、Bluetoothカセットアダプタなるものの存在を知って、なんだか気になり始めてしまった。
大昔の8bitPCは、カセットテープからプログラムをロードして動かすわけだけど、Bluetoothカセットアダプタを使えば、今時のPCだのスマホだのからBluetooth(無線)で音声データを送って、昔の8bitPCにプログラムを読み込ませることができるようになるはずで。カセットテープという物理的なメディアを管理しなくても済む点は、なんだか便利そうだなと…。
ただ、ググった感じでは、もう商品ジャンルとして存在していないようでもあり…。2014年〜2016年頃は、まだ販売されていたみたいだけど…。いやまあ、今でも Amazon で検索すれば一応出てくるけれど、どれもカセットアダプタから謎の線が飛び出してる製品ばかりで、8bitPCのデータレコーダ(カセットテープを入れる部分)に、物理的に入るかどうかビミョーだよなと…。線が引っ掛かりそう…。
となると、自作するしか手は無さそうだけど、有線カセットアダプタとBluetoothヘッドセットを分解して作業することになるようで…。それはちょっと面倒臭いな…。カセットアダプタに入らないヘッドセットを買ってしまったらダメージもデカいだろうし…。
ちょっと待て。落ち着け自分。そもそもお前、今後レトロPC(MZ-700)の実機を起動する機会がどれだけあるのかと。そういえば今現在、表示デバイスは持っているのだろうか…? 実は画面すら出せない状況だったりしないか。
ということで、冷静になって考えたら今時そんなものを入手してどうするの、滅多に使わないだろう、てな話なのだけど…。でも、なんだか気になる…。
他にも、今時のPCからUSB経由でバイナリを送信してレトロPCのパラレルポートで受け取る方法とか、レトロPCからSDカードを読めるようにする方法もあったりするっぽい。カセットテープ(データレコーダ)から読み込むと数分かかってしまうけど、USB経由だの、SDカードだのから読み込むならロード時間も短縮できそう…。ちょっと待て。落ち着け自分。
大昔の8bitPCは、カセットテープからプログラムをロードして動かすわけだけど、Bluetoothカセットアダプタを使えば、今時のPCだのスマホだのからBluetooth(無線)で音声データを送って、昔の8bitPCにプログラムを読み込ませることができるようになるはずで。カセットテープという物理的なメディアを管理しなくても済む点は、なんだか便利そうだなと…。
ただ、ググった感じでは、もう商品ジャンルとして存在していないようでもあり…。2014年〜2016年頃は、まだ販売されていたみたいだけど…。いやまあ、今でも Amazon で検索すれば一応出てくるけれど、どれもカセットアダプタから謎の線が飛び出してる製品ばかりで、8bitPCのデータレコーダ(カセットテープを入れる部分)に、物理的に入るかどうかビミョーだよなと…。線が引っ掛かりそう…。
となると、自作するしか手は無さそうだけど、有線カセットアダプタとBluetoothヘッドセットを分解して作業することになるようで…。それはちょっと面倒臭いな…。カセットアダプタに入らないヘッドセットを買ってしまったらダメージもデカいだろうし…。
ちょっと待て。落ち着け自分。そもそもお前、今後レトロPC(MZ-700)の実機を起動する機会がどれだけあるのかと。そういえば今現在、表示デバイスは持っているのだろうか…? 実は画面すら出せない状況だったりしないか。
ということで、冷静になって考えたら今時そんなものを入手してどうするの、滅多に使わないだろう、てな話なのだけど…。でも、なんだか気になる…。
他にも、今時のPCからUSB経由でバイナリを送信してレトロPCのパラレルポートで受け取る方法とか、レトロPCからSDカードを読めるようにする方法もあったりするっぽい。カセットテープ(データレコーダ)から読み込むと数分かかってしまうけど、USB経由だの、SDカードだのから読み込むならロード時間も短縮できそう…。ちょっと待て。落ち着け自分。
◎ 参考ページをメモ。 :
_宇宙時代到来の巻! - 祝!MZ-700発売39周年ブログ
_【実験】Bluetoothカセットアダプタの製作
_レトロゲーマーへの道〜Bluetoothカセットアダプターの製作実験 - 「ちまちま」のゲーム日記。
_「☆ Bluetooth カセットアダプター 作成」ホワイトツリーのブログ | ☆ 楽しく遊べたら、それでいいんです!(^_^)v。 - みんカラ
_【魔改造】Bluetooth接続対応!!カセットテープ自作方法・手順【ジャンク】 - YouTube
_MZ <--> PC データ転送(USB版)
_MZ-700に高速でテープイメージを流し込めます。 - MZ-700にパラレルポート経由でWindowsPCからUSB経由でテープイメージを流し込める装置のレビュー | ジグソー | レビューメディア
_GitHub - yanataka60/MZ80K_SD: You can use the load/save function with SD-Card instead of CMT of MZ-80K.
どれも楽しそうではある…。夢がひろがりんぐ…。いや、ちょっと待て。落ち着け自分。
_【実験】Bluetoothカセットアダプタの製作
_レトロゲーマーへの道〜Bluetoothカセットアダプターの製作実験 - 「ちまちま」のゲーム日記。
_「☆ Bluetooth カセットアダプター 作成」ホワイトツリーのブログ | ☆ 楽しく遊べたら、それでいいんです!(^_^)v。 - みんカラ
_【魔改造】Bluetooth接続対応!!カセットテープ自作方法・手順【ジャンク】 - YouTube
_MZ <--> PC データ転送(USB版)
_MZ-700に高速でテープイメージを流し込めます。 - MZ-700にパラレルポート経由でWindowsPCからUSB経由でテープイメージを流し込める装置のレビュー | ジグソー | レビューメディア
_GitHub - yanataka60/MZ80K_SD: You can use the load/save function with SD-Card instead of CMT of MZ-80K.
どれも楽しそうではある…。夢がひろがりんぐ…。いや、ちょっと待て。落ち着け自分。
[ ツッコむ ]
#3 [nitijyou] OPPテープ購入
ホーマックでOPPテープなるものを購入してきた。以前何かをググっていた際にそういうテープがあると知って気になっていたのだけど、ようやくゲットできた。
とりあえず、玄関周辺の電気コードを隠すモールが落ちそうになっていたので、梱包用OPPテープを貼って止めてみた。今までは養生テープで対処してたけど、半透明だから見た目は悪いし、すぐに剥がれるしで…。今回購入した品は透明を謳うだけあって、パッと見はテープが貼ってあることも分からない状態になった。ただ、次回テープを剥がそうとした際は、テープの粘着力が強いから壁までバリバリと剥がれるだろうけど…。その時は貼れる壁紙の類を入手してどうにか誤魔化そう…。
- 3M Scotch 超透明テープS CC1510-D-N, 15mm x 10m, 151円
- 3M Scotch 透明梱包用テープ 重量物用 315DSN, カッター付き, 48mm x 50m, テープ厚 0.09mm, 580円
とりあえず、玄関周辺の電気コードを隠すモールが落ちそうになっていたので、梱包用OPPテープを貼って止めてみた。今までは養生テープで対処してたけど、半透明だから見た目は悪いし、すぐに剥がれるしで…。今回購入した品は透明を謳うだけあって、パッと見はテープが貼ってあることも分からない状態になった。ただ、次回テープを剥がそうとした際は、テープの粘着力が強いから壁までバリバリと剥がれるだろうけど…。その時は貼れる壁紙の類を入手してどうにか誤魔化そう…。
◎ 乾電池も購入。 :
ケーズデンキで単3乾電池を購入。
わざわざ液漏れ保障を謳うぐらいだから、そうそう液漏れはしないだろう、しないといいなと期待しつつ購入。100円ショップ等で売っている乾電池と比べるとお値段はちょっと高いけど、以前ダイソーで購入した乾電池が軒並み液漏れしてしまって、いくつかの電子機器をダメにしてしまったので、もう安さだけで乾電池は選ばないぞ、と…。1本数十円をケチったせいで、数千円、数万円の機器を台無しにしてたら馬鹿馬鹿しい話だし…。
- maxell ボルテージ(VOLTAGE) LR6(T) 12P (12個入り), 液漏れ保障付き, 780円 (1本65円)
わざわざ液漏れ保障を謳うぐらいだから、そうそう液漏れはしないだろう、しないといいなと期待しつつ購入。100円ショップ等で売っている乾電池と比べるとお値段はちょっと高いけど、以前ダイソーで購入した乾電池が軒並み液漏れしてしまって、いくつかの電子機器をダメにしてしまったので、もう安さだけで乾電池は選ばないぞ、と…。1本数十円をケチったせいで、数千円、数万円の機器を台無しにしてたら馬鹿馬鹿しい話だし…。
[ ツッコむ ]
以上、1 日分です。