ダイアログでファイルを選択する。

Python

ダイアログでファイルを選択する。

ファイルを開こうとした際、コードが保存されているフォルダと同じ場所にファイルを移動していたと思いますが、 これって、面倒ですよね。

そこで、今回は別フォルダにある画像でもダイアログを使ってファイルを選択する方法を示していきたいと思います。

pythonのGUIインターフェイスであるTkinterというものを使っていきます。


付け加えるコード

コードは以下となります。

import tkinter         #tkinterをインポート
from tkinter import filedialog as tkFileDialog
                #tkinterのfiledialogをインポート 

def fileselect():
    root=tkinter.Tk()     #tkinterのインスタンスを生成
    root.withdraw()          #この一文が無いと謎の黒いウインドウが出てくるらしい

    fTyp=[('','*')]     #ダイアログに表示するファイル種類を指定。
                            #fTyp=[('テキストファイル','*.txt')]   
                            #上記の様にすればテキストファイルのみに絞れる。
                            #()を足していくことで複数指定することも可能。

    iDir='C:/Desktop'    #ダイアログが開くディレクトリを指定
                           #今回はデスクトップ

    
    filename = tkFileDialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    return filename    #選択ファイルの絶対パスを返します。
 

前回も出てきましたが、関数というものを作っていきます。

難しく考えなくて大丈夫です。

何度も行う処理を一か所に書いておくと考えておけばいいと思います。


def ○○○():   ○○○の部分は関数名。 今回はfileselectという名前

という部分がありますが、その下の部分はインデント(字下げ)されていると思います。その下がっている部分までが一つの処理(関数)として扱われます。

そして、その処理は、プログラム途中で名前を指定してあげることで呼び出すことができます。

呼び出し方は

○○○()

だけです。()内は、関数に渡す情報を記載しますが、それは今後ということで。

それでは前回作った、CT画像のWW,WLをスライダーを使って調整するのプログラムにダイアログを使ってファイルを選択する機能をを追加していきたいと思います。

まずは、前回のimportの部分の下に今回のコードをペーストします。

# -*- coding: utf-8 -*-

import pydicom
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider
             #matplotlibのSliderというウイジットを使用します。


#############今回のコードをペースト#########################

import tkinter       #tkinterをインポート
from tkinter import filedialog as tkFileDialog
              #tkinterのfiledialogをインポート 

def fileselect():
    root=tkinter.Tk()    #tkinterのインスタンスを生成
    root.withdraw()        #この一文が無いと謎の黒いウインドウが出てくるらしい

    fTyp=[('','*')]     #ダイアログに表示するファイル種類を指定。
                           #今回は指定なし
                           #fTyp=[('テキストファイル','*.txt')]   
                           #上記の様にすればテキストファイルのみに絞れる。
                           #()を足していくことで複数指定することも可能。

    iDir='C:/Desktop'    #ダイアログが開くディレクトリを指定
                           #今回はデスクトップ

    
    filename = tkFileDialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    return filename    #選択ファイルの絶対パスを返します。

続いてダイアログを開いてファイル名を指定する部分を関数として記載していきます。

前回のプログラムでは

ds = pydicom.dcmread(‘CT000060’)

の部分でファイル名を指定していますが、この前に変数(fname)としてファイルの絶対パスを受け取りたいと思います。

fname = fileselect ()

とすることでfnameという関数にfileselect関数で取得した絶対パスを格納することができました。

そして、直接ファイル名で指定していた部分を変数fnameとすることでダイアログで選択したファイルを開くことができます。

fname = fileselect()     #fileselectの最後returnで返されたものをfnameに格納

ds = pydicom.dcmread(fname)
               #'CT000060'と指定してたファイルをfnameと書き換える

それでは、修正したコード全体を以下に示します。


完成コード

# -*- coding: utf-8 -*-

import pydicom
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider
                         #matplotlibのSliderというウイジットを使用します。


#############ここから今回のコード#################

import tkinter           #tkinterをインポート
from tkinter import filedialog as tkFileDialog
                         #tkinterのfiledialogをインポート

def fileselect():
    root=tkinter.Tk()    #tkinterのインスタンスを生成
    root.withdraw()        #この一文が無いと謎の黒いウインドウが出てくるらしい

    fTyp=[('','*')]      #ダイアログに表示するファイル種類を指定。
                         #今回は指定なし
    #fTyp=[('テキストファイル','*.txt')]
                         #上記の様にすればテキストファイルのみに絞れる。
                         #()を足していくことで複数指定することも可能。

    iDir='C:/Desktop'    #ダイアログが開くディレクトリを指定
                         #今回はデスクトップ

    
    filename = tkFileDialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    return filename      #選択ファイルの絶対パスを返します。

#############ここまでが今回のコード###############

#############以下修正した部分#####################

fname = fileselect()     #fileselectの最後returnで返されたものをfnameに格納

ds = pydicom.dcmread(fname)
                         #'CT000060'と指定してたファイルをfnameと書き換える

#############ここまでが修正した部分################


low = -140                #WWを-140~260の範囲で表示したいため
high = 260                #WLは-140~260の中央値である60になります。

fig = plt.figure(figsize=(5, 6))  #画像、スライダを表示する領域の設定

img = plt.imshow(ds.pixel_array, cmap=plt.cm.bone, vmin=low, vmax=high)
                          #imgという変数に画像表示設定を入れる。

wl_slider_pos = plt.axes([0.1, 0.08, 0.8, 0.03])
ww_slider_pos = plt.axes([0.1, 0.01, 0.8, 0.03])
                          #ww、wlのスライダを表示する位置の設定

wl_slider = Slider(wl_slider_pos, 'wl', 0, 500, valinit=175)
ww_slider = Slider(ww_slider_pos, 'ww', 0, 2000, valinit=350)
                          #ww、wlのスライダのインスタンスを作成

def update(slider_val): #スライダを動かしたときの処理
    ww = ww_slider.val
    wl = wl_slider.val
                          #ww、wlのスライダの値を取得

    low = int(wl - ww/2)
    high = int(wl + ww/2)
                          #wwの上限値と下限値を計算

    img.set_clim([low, high])
                          #画像表示の設定imgのlow,highの値を更新

    fig.canvas.update()
                          #表示している画像を更新

wl_slider.on_changed(update)
ww_slider.on_changed(update)
                         #スライダーを動かしたときの処理を指定(25行目に)

plt.show()
                         #画像を表示

いかがでしたか?

次回は、ダイアログで複数ファイルを選択する方法をやってみたいと思います。


環境

  • windows10
  • python3.6.1
  • Anaconda custom(64-bit)
  • PyCharm2020.2(Communication Edition)



タイトルとURLをコピーしました