画像入力ボードとは?設定の勘所、CC信号とは?

画像入力ボードは、主に工業用のカメラを用いる時に、PCのスロットに刺して用いられます。
他にもフレームグラバ(frame grabber)やキャプチャボードと言ったりもしますが、キャプチャボードと言うと、民生品のビデオキャプチャボードを指す場合が多いので、私は画像入力ボードと言うようにしています。

画像入力ボードでは、一般的なWebカメラなどとは違って、様々な設定が出来る分だけ、ハマりやすいポイントもあるので、そのへんの勘所をまとめてみたいと思います。

 

まずは画像入力ボードを使った一般的なシステムを以下に示します。

画像入力ボードへは、移動する被写体の動きに合わせて撮影できるように、光電センサなどのトリガセンサの信号を入力したり、ベルトコンベアなどのような搬送系を用いる場合は、搬送速度のムラにも対応するためにエンコーダを接続します。

このトリガ信号やエンコーダ信号を用いて、画像入力ボードは同期信号を生成し、カメラへ送ります。
この同期信号では、カメラで撮影する画像の各フレーム1枚1枚の撮影タイミング(ラインセンサの場合は、各ラインの撮影タイミング)や露光時間を制御します。

工業用のカメラでは、この同期信号に連動して撮影できる事が大きな特徴ですが、この同期信号の事をCameraLinkというカメラの接続規格では Camera Control信号(略:CC信号)といいます。

さらに、カメラで撮影された画像データは一般的な画像データのように画像の左上から整然と輝度データは出力されない場合もあるので、画像入力ボードで画像の輝度データを整列し、PCのメモリへ格納します。

一般的なWebカメラと工業用カメラとの違い

一般的なWebカメラでは以下のような以下のような構成になります。

上図のように、一般的なWebカメラでは同期信号の入力がありません。

このことは、例えば30fpsのカメラでは、1/30秒ごとに画像の撮影しています。
この状態で移動する被写体を撮影すると、1/30秒ごとに被写体が画像の中心にあるとは限らないため、被写体の撮影位置がバラバラな状態になってしまいます。

(撮影画像)

これは、たとえIOボードを用いてトリガセンサを繋いだとしても、同期信号が無いと、各フレームの撮影タイミングは制御できないため、撮影位置がバラバラになってしまいます。

さらに画像データは圧縮されてUSBを介してPCへ転送され、CPUで画像データをデコードし、画像データをPCのメモリへ配置される場合もあるため、CPUに負荷がかかります。

また、データ圧縮は非可逆となる場合も多く、細かい欠陥を検査するような場合の用途では不向きです。

カメラの設定とボードの設定がある

画像入力ボードを使ってカメラの画像を撮影するには、カメラとボードの設定を、それぞれ行う必要があります。主な設定値には以下のようなものがあります。

カメラの設定 ボードの設定
画像の幅
画像の高さ
同期モード(内部、外部)
フレームレート(スキャンレート)
露光時間
ゲイン
オフセット
画像の幅
画像の高さ
同期信号出力の有効/無効
フレームレート(スキャンレート)
露光時間
トリガの有効/無効
エンコーダの設定

上記のように、似た設定がカメラとボードの両方にあるので、最初は混乱しやすいのですが、ちゃんと把握しておく必要があります。

画像の幅、高さ

カメラの画像の幅と高さの設定は、カメラから画像入力ボードへ転送される画像のサイズで、画像入力ボードの幅と高さは、カメラから送られてきた画像から部分的に切り取るサイズとなります。

ラインセンサカメラの場合、カメラから出力される画像の高さは1となるため、ボードの設定の高さは何ライン分の画像データを1画面分の画像データとするか?の設定となります。

同期モード、同期信号出力設定

カメラの同期モードの設定は、各フレームの撮影タイミング、露光時間をカメラ自身のタイミングで撮影する設定(フリーラン、自走モード)と、画像入力ボードから送られてきた同期信号に基づいて撮影する設定とがあります。前者の設定を内部同期フリーラン、自走モードなどと言い、後者の設定を外部同期ランダムシャッタなどを言います。

ボードの同期信号出力の設定は、画像入力ボードからカメラへ同期信号を送るか?送らないか?の設定になりますが、ボードから同期信号を出力していても、その同期信号を使う/使わないの設定はカメラの設定となるため、通常、同期信号は出力する設定にしておきます。

フレームレート、露光時間

カメラのフレームレートと露光時間の設定は、カメラがフリーラン(自走モード)の時に、カメラに設定されたフレームレートと露光時間で動作し、カメラが外部同期の場合は、ボードに設定されたフレームレートと露光時間で動作します。

ゲイン、オフセット

ゲイン、オフセットの設定は、カメラのセンサに対して行う設定となるため、カメラ特有の設定となります。

トリガの有効/無効設定

トリガという言葉は、カメラへ送られる同期信号の事をトリガという場合もあるので、ややこしいのですが、撮影開始タイミングをフォトセンサなどを通過したタイミングで撮影する場合は、トリガの設定を有効にします。ただし、トリガを有効にする場合は、各フレームの撮影タイミングをトリガのタイミングに合わせる必要があるので、カメラの同期モードを外部同期モードにする必要がります。

エンコーダの設定

エンコーダ信号に同期して撮影する場合は、撮影開始のタイミングをエンコーダの何パルス後に撮影するか?の設定や、エンコーダ何パルスごとに撮影するか?の設定があります。

同期信号(CC信号)のしくみ

画像入力ボードから、カメラへ送られる同期信号のお話です。

同期信号は下図のような矩形波(パルス信号)がカメラへ送られます。

この矩形波をカメラが受けて、カメラがどうのような挙動をするか?は、カメラの機能やカメラの設定次第な部分もありますが、代表的な例としては、上図のように、同期信号の立ち上がり部分でカメラの露光を開始し、信号のHigh期間分、露光し、信号が立ち下がると画像データをPCへ転送します。あとは、この繰り返しです。

大事なのは、このCC信号により、カメラの各フレームの撮影タイミングと露光時間を制御できるという事です。
※カメラによってはHighとLowが逆の場合もあります。

同期信号(CC信号)の生成(画像入力ボードの動作、設定)

画像入力ボードではトリガセンサの信号やエンコーダ信号を受けて同期信号(CC信号)を生成しますが、トリガセンサを使う/使わない、エンコーダを使う/使わない設定により、いくつかのパターンがあります。

トリガ、エンコーダを使わない場合

画像入力ボードに同期信号の周期(フレームレート、スキャンレート)とHigh期間の時間(露光時間)を設定し、定期的にCC信号を出力します。

 

 

フレームレートと露光時間を画像入力ボード側で制御が可能となります。

ただし、実際にカメラで撮影されるフレームレートと露光時間はカメラの設定次第となります。

トリガを使用し、エンコーダを使用しない場合

トリガ信号を有効にし、エンコーダを無効にする撮影は、ベルトコンベアのようなライン上を流れてくる被写体をエリアセンサで撮影する場合に、よく用いられます。

トリガ信号が画像入力ボードに入力されたら、CC信号を1パルス分出力します。
設定によりトリガ1パルスにつき、何パルスか出力する設定する事も可能です。

また、トリガ信号の立下りから、実際にCC信号が出力されるまでの時間を調整する事も可能です。

トリガ、エンコーダを使用する場合

ラインセンサの場合は、エンコーダ信号と同期させる場合が多くあります。

下図のように、トリガ信号が入力されたら、指定パルス数分遅らせてから最初のCC信号を出力します。
次のCC信号は、指定パルス数分のエンコーダパルスごとにCC信号を出力します。

下図の例では、トリガ信号入力後、8パルス後にCC信号を出力し、以降は4パルスおきにCC信号を出力する例です。

ただし、エンコーダ信号はA相、B相の両方をカウントして、エンコーダの呼称パルス数の2倍でカウントする2逓倍と呼ばれるカウント方法やA相、B相の立ち上がり、立下りをカウントし、4倍でカウントする4逓倍のカウント方法があります。

CC信号による同期撮影(カメラの動作、設定)

前項目の同期信号の生成では、画像入力ボードがどのような同期信号を生成するか?の話であって、実際にカメラがどうように同期信号に基づいて撮影をするか?はカメラ側の設定次第となります。

同期信号(CC信号)を使用しない場合

カメラに設定したフレームレートと露光時間に基づいて生成した信号に同期してセンサを露光します。

この設定を内部同期 フリーランと呼びます。

通常、カメラの初期値では、このフリーラン状態設定されています。

同期信号(CC信号)を使用する場合

カメラの外部(画像入力ボード)で生成された同期に同期してセンサを露光します。

この設定を外部同期 などと言います。

この設定を使用するには、カメラの設定をしないといけないのですが、「外部同期」という言葉はカメラメーカーによって、まちまちなため、最初は戸惑うと思います。(私も毎回戸惑ってます。。)

この外部同期で撮影しているつもりで、画像入力ボードの露光周期(フレームレート、スキャンレート)と露光時間を変更しても撮影した画像の明るさやフレームレートが変化しないな?と思ったら、まずは、カメラが外部同期の設定になっているかどうかを確かめて下さい。

様々な同期撮影モード

画像入力ボードは同期信号を生成してカメラへ入力しますが、その同期信号に基づいて、どのような露光時間で撮影するか?はカメラによっては、いくつかのモードがある場合があります。(モードが無い場合もあります。)

最初の方で説明したように、露光時間とフレームレート(スキャンレート)の設定は、カメラとボードのそれぞれに存在します。

この露光時間とフレームの設定を、どちらの設定を使うか?は、カメラ側の設定(露光モードなどと言われる)で決まります。

同期信号(CC信号)のHight期間分だけ露光するモード

比較的一般的な撮影モードです。

CC信号の立ち上がりから露光を開始し、CC信号がHigh期間分だけ露光をします。

カメラに設定された露光時間で露光するモード

ラインセンサカメラで比較的採用されているモードです。

CC信号の立ち上がりから露光を開始しますが、露光時間そのものは、カメラに設定された露光時間で露光します。

次の露光開始まで、可能な限りの最大露光時間で露光するモード

CC信号の立ち上がりから次の立ち上がりまでの間で可能な限りの露光時間で露光するモードです。

この事は、エンコーダと同期して撮影している場合、被写体の移動速度が変化すると、露光時間も変化してしまうので、使いづらいモードではあるのですが、TDIセンサでは、このモードになっている場合が多くあります。

 

ポイント!
カメラの最速フレームレート以上の周期でCC信号をカメラへ入力してはいけない

例えば、カメラの最速フレームレートが30fpsのカメラに1秒あたり50パルス(50fps相当)のCC信号をカメラへ入力してはいけません。

実際に必要以上にCC信号を入力してしまった場合、カメラが壊れる事はない?と思いますが、どのような挙動になるか?は使用するカメラによって異なるのですが、比較的多いパターンとしては

  • 必要以上のCC信号のパルスが無視される。
    →結果として、フレームレート、スキャンレートが想定以上に遅くなります。
    ラインセンサカメラの場合、縦が縮んだ画像になります。
  • 撮影した画像の一部が前のフレームの画像と混ざった画像になる。
  • カメラが反応しなくなる。

など。。

この状態は、エンコーダと同期して撮影する際に陥る事がよくあります。

何かおかしい!と思った場合は、搬送速度を遅くする、CC信号の出力周期を遅くなるように設定するなどしてください。このように遅くしていくと、途中から正規のCC信号になった瞬間、フレームレートがカメラの最速の状態で撮影が出来るので、確認ができると思います。

ポイント!
カメラの露光時間以下の周期でCC信号を生成しようとしてはいけない

露光時間より短い間隔で撮影する事ができないのは、当たり前のように思われるかもしれませんが、エンコーダと同期して撮影すると陥りやすい状態です。

この状態になると、前項と同じような症状になるので、まずは搬送速度を遅くする、CC信号の出力周期を遅くするように試してみてください。

ポイント!
エンコーダと同期撮影では、ほぼ最速のフレームレート(スキャンレート)は出せない

これは何故??と思われるかもしれませんが、そもそも、なぜエンコーダと同期させて撮影しようとしているかというと、搬送速度がバラついても歪みの無い画像を撮影するためであって、エンコーダ信号にもバラつきがあります。

このような状態で、CC信号の周期が速くなるような設定を行うと、ところどころでカメラの最速フレームレート(スキャンレート)を超えてしまいます。

それでも、搬送速度にバラつきが無いので、最速で撮影したい!と言われる場合があるのですが、その時はエンコーダとの同期をしない(フリーランで撮影する)と、カメラの最速が狙えます。

まとめ

露光時間とフレームレートの設定の概念は、画像入力ボード側とカメラ側の両方(別々)にあります。

自分が内部同期で撮影したいのか?外部同期で撮影したいのか?明確に意識して両方の設定をしてください。

また、特にエンコーダと同期して撮影する場合には、カメラの最速フレームレート、スキャンレートを超えないように注意してください。

何かおかしいな?と思ったときは、まずはフレームレートを遅くするように、搬送速度を遅くする(エンコーダの周波数を下げる)、スキャンレートを遅くするなど、してみてください。
ボード側の設定を変えてもフレートレート(スキャンレート)に変化が無い場合は、カメラの設定が内部同期になっている可能性が高いですし、フレートレート(スキャンレート)を遅くする事で、実際にカメラで撮影したフレートレート(スキャンレート)が速くなる場合は、カメラの最速のフレートレート(スキャンレート)以上の設定をしていた可能性が高いです。

参考

https://faq-avaldata.dga.jp/faq_list.html?category=4

https://www.avaldata.co.jp/products/imaging/category/imageInputBoard

【Python/tkinter】PanedWindow(C#のSplitContainer相当)

C#では、SplitContainerを使ってPictureBoxのサイズなどを変更していたのですが、tkinterでは、このSplitContainerに相当するものがPanedWindowとなります。

PanedWindowのサンプルプログラムを以下示します。

(実行画面)

仕切り線の移動

 

(プログラム)

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)

        self.master.geometry("300x200") # ウィンドウサイズ(幅x高さ)

        # PanedWindowの作成
        paned_window = tk.PanedWindow(self.master)
        # フレームの作成
        frame1 = tk.Frame(paned_window, width = 100, bg = "red")
        frame2 = tk.Frame(paned_window, width = 100, bg = "green")
        # フレームをPanedWindowに追加
        paned_window.add(frame1)
        paned_window.add(frame2)

        paned_window.pack(expand = True, fill = tk.BOTH)


if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

PanedWindowはC#のSplitContainerと似てはいるのですが、異なる部分もあります。

  • C#のSplitContainerでは、最初からPanel1,Panel2が配置されていますが、PanedWindowには何も配置されていない。(自分でウィジェットをPanedWindowに追加する必要があります。)
  • PanedWindowにはFrame以外にもLabelやButtonなどのウィジェットが配置できる。
  • ウィジェットを追加すると、ウィジェットとウィジェットの間に仕切り線(sash)が追加される。
  • PanedWindowには3つ以上のウィジェットを追加できる。
  • ウィンドウをリサイズした時に、一番右(もしくは一番下)のウィジェットのみがリサイズされる。

 

オプション

オプション名 説明
background 通常時(クリックされていないとき)の背景色を指定します。(bgと同じ)
bd 外枠の線の太さを指定します。
ただし、初期状態では枠線が表示されていないため、reliefで枠線のスタイルを指定する必要があります。(borderwidthと同じ)
bg backgroundと同じ
borderwidth bdと同じ
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
handlepad ハンドル(四角いマーク)の位置を指定します。
handlesize ハンドル(四角いマーク)の大きさを指定しますs。
height ウィジェットの高さを指定します。
opaqueresize 仕切り線(sash)を移動中に表示を更新する場合はTrue、更新しない場合はFalseを指定します。
【初期値】True
orient ウィジェットを横に並べる場合は tk.HORIZONTAL、縦に並べる場合は tk.VERTICALを指定します。
【初期値】tk.HORIZONTAL
sashpad 仕切り線(sash)の両側に追加する隙間の大きさを指定します。
sashrelief 仕切り線(sash)のスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
sashwidth 仕切り線(sash)の幅を指定します。
【初期値】3
showhandle ハンドルと呼ばれる四角い印を仕切り線上に表示する場合はTrue、表示しない場合はFalseを指定します。
【初期値】False
width ウィジェットの幅を指定します。

メソッド

メソッド 説明
add(child[, option=value] …) ウィジェットをPanedWindowに追加します。
forget(child) 追加したウィジェットを削除します。
identify(x, y)
panecget(child, option)
paneconfig(child, option=value, …)
panes() PanedWindowに追加されているウィジェットのリストを取得します。
remove(child)
追加したウィジェットを削除します。
sash_coord(index)
仕切り線(sash)の位置を取得します。
sash_place(index, x, y) 仕切り線(sash)の位置を指定します。
indexは仕切り線の順番0, 1, 2・・・

 

【Python/tkinter】Canvas(キャンバス)の作成

Canvasは、線や円などの図形や画像を表示するためのベースとなるものとなります。

C#でいうところのPictureBoxです。

Canvasには、図形や画像を表示する以外にも描画領域をスクロールできる機能もありますが、今回はCanvasの作成についてです。

ただ、Canvasを配置しただけの簡単なサンプルは以下のようになります。

 

(実行画面)

(プログラム)

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)

        self.master.title("タイトル")    # ウィンドウタイトル
        self.master.geometry("300x200") # ウィンドウサイズ(幅x高さ)

        # Canvasの作成
        canvas = tk.Canvas(
            self.master, 
            width = 200,
            height = 100,
            bg = "cyan"
            )
        # Canvasを配置
        canvas.pack()

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

オプション

オプション名 説明
background 背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。(borderwidthと同じ)
bg 背景色を指定します。(backgroundと同じ)
borderwidth 枠線の太さを指定します。(bdと同じ)
closeenough
confine
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
height キャンバスの高さを指定します。
highlightbackground
highlightcolor
highlightthickness
insertbackground
insertborderwidth
insertofftime
insertontime
insertwidth
offset
relief キャンバスの枠線のスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
scrollregion スクロールする領域のサイズを指定します。
selectbackground
selectborderwidth
selectforeground
state ウィジェットの有効(NORMAL)/無効(DISABLED,操作できない状態)を指定します。
【設定値】tk.NORMAL, tk.DISABLED
【初期値】tk.NORMAL
takefocus
width キャンバスの幅を指定します。
xscrollcommand 横方向にスクロールするスクロールバーの スクロールバー.set を指定します。
xscrollincrement 横方向のスクロールバーの矢印をクリックしたときの移動量を指定します。
yscrollcommand 縦方向にスクロールするスクロールバーの スクロールバー.set を指定します。
yscrollincrement 縦方向のスクロールバーの矢印をクリックしたときの移動量を指定します。

 

関連記事

Canvasに画像を表示する方法については、以下のページを参照ください。

【Python/tkinter】Canvasに画像を表示する

【Python/NumPy】行列の演算(積、逆行列、転置行列、擬似逆行列など)

個人的には、行列は最小二乗法で近似式を求めるときや、アフィン変換を用いて画像の表示やリサイズを行う際に用いるのですが、この行列の演算は、PythonではNumPyを用いて行います。

NumPyのインポート

import numpy as np

行列の生成(array)

# 行列の生成
mat = np.array([[1, 2], [3, 4], [5, 6]])
print(mat)

(実行結果)

[[1 2]
 [3 4]
 [5 6]]

行列の積(matmul)

matA = np.array([[1, 2], [3, 4]])
matB = np.array([[5, 6], [7, 8]])
matAB = np.matmul(matA, matB)
print(matAB)

(実行結果)

[[19 22]
 [43 50]]

単位行列(identity)

matI = np.identity(3)
print(matI)

(実行結果)

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

零行列(zeros)

mat = np.zeros((3, 4))
print(mat)

(実行結果)

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

逆行列(linalg.inv)

mat = np.array([[1, 2], [3, 4]])
matInv = np.linalg.inv(mat)
print(matInv)

(実行結果)

[[-2.   1. ]
 [ 1.5 -0.5]]

擬似逆行列(linalg.pinv)

mat = np.array([[1, 2], [3, 4], [5, 6]])
matInv = np.linalg.pinv(mat)
print(matInv)

(実行結果)

[[-1.33333333 -0.33333333  0.66666667]
 [ 1.08333333  0.33333333 -0.41666667]]

転置行列(.T)

mat = np.array([[1, 2], [3, 4]])
matT = mat.T
print(matT)

(実行結果)

[[1 3]
 [2 4]]

行列要素ごとの積(multiply)

matA = np.array([[1, 2], [3, 4]])
matB = np.array([[5, 6], [7, 8]])
matAB = np.multiply(matA, matB)
print(matAB)

(実行結果)

[[ 5 12]
 [21 32]]

【Python/tkinter】名前を付けて保存ダイアログボックスの表示

名前を付けて保存ダイアログボックスを表示するには、tkinter.filedialogモジュールのasksaveasfilename()関数を使います。

以下にシンプルなサンプルプログラムを示します。

from tkinter import filedialog

filename = filedialog.asksaveasfilename()
print(filename)

(実行結果)

 

オプション

オプション名 説明
parent ダイアログを表示する親のウィンドウを指定します。
title ダイアログのタイトルを指定します。
initialdir 最初に表示されるディレクトリを指定します。
initialfile 最初に選択されているファイル名を指定します。
filetypes 選択可能なファイルの種類を設定します。
defaultextension 拡張子が入力されない場合に追加する拡張子を指定します。

(参考)

https://docs.python.org/ja/3/library/dialog.html?highlight=askopenfilename#module-tkinter.filedialog

 

名前を付けて保存ダイアログボックスはファイルを開くダイアログボックスとも似ていますが、defaultextensionオプションが異なります。

これは名前を付けて保存ダイアログの「ファイル名」の部分に拡張子を指定しなかった場合に、defaultextensionオプションで指定した拡張子が付加されます。

 

それでは、defaultextensionオプションを指定せずにfiletypesオプションを指定すると、どうなるか?というと、「ファイル名」の部分に、拡張子を付けずにファイル名を入力しても、「ファイルの種類」で指定された拡張子で、拡張子が自動で付加される事はありません。

filename = filedialog.asksaveasfilename(
    filetypes = [("Bitmap", ".bmp"), ("PNG", ".png"), ("JPEG", ".jpg"), ("Tiff", ".tif") ], # ファイルフィルタ
    )

そのため、filetypesオプションとdefaultextensionオプションは両方指定して、以下のようにします。

from tkinter import filedialog

filename = filedialog.asksaveasfilename(
    title = "名前を付けて保存",
    filetypes = [("Bitmap", ".bmp"), ("PNG", ".png"), ("JPEG", ".jpg"), ("Tiff", ".tif") ], # ファイルフィルタ
    initialdir = "./", # 自分自身のディレクトリ
    defaultextension = "bmp"
    )
print(filename)

このようにすると、「ファイルの種類」で指定された拡張子で、自動で拡張子が付加されます。

上記のプログラムではdefaultextension が “bmp”ですが、「ファイルの種類」がPNGのときは、ちゃんと.pngを付加してくれます。

もっというと、defaultextension = “” としても、「ファイルの種類」で指定された拡張子が付加されます。

(実行結果)

 

関連記事

【Python/tkinter】ファイルを開くダイアログボックスの表示

【Python/tkinter】Frame(フレーム)

Frameはいくつかのウィジェットを配置するための枠、まさにフレームです。
C#でいうところのPanelと同じです。

Frameを使うとウィジェットの配置の自由度が増します。
ウィジェットを配置するには、pack,grid,placeの3つのメソッドがありますが、一つのコンテナ(Frameなど)にはpack,grid,placeの3つの混在使用ができないのですが、複数のFrameを用いて、まずは大枠を作り、そこにウィジェットを配置すると、比較的簡単にイメージ通りの画面が作成できると思います。

Frameを使って、ツールバー、ステータスバー、右カラムを作ってみたいと思います。

(実行画面)

(プログラム)

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)

        self.master.geometry("300x200") 

        #---------------------------------------
        #  ツールバー
        #---------------------------------------
        # ツールバー用Frame
        frame_toolbar = tk.Frame(self.master)
        # ツールボタン
        button1 = tk.Button(frame_toolbar, text = "1", width = 2)
        button2 = tk.Button(frame_toolbar, text = "2", width = 2)
        button3 = tk.Button(frame_toolbar, text = "3", width = 2)
        # ボタンをフレームに配置
        button1.pack(side = tk.LEFT)
        button2.pack(side = tk.LEFT)
        button3.pack(side = tk.LEFT)
        # ツールバーをウィンドの上に配置
        frame_toolbar.pack(fill = tk.X)

        #---------------------------------------
        #  ステータスバー
        #---------------------------------------
        # ツールバー用Frame
        frame_statusbar = tk.Frame(self.master, relief = tk.SUNKEN, bd = 2)
        # ステータスラベル
        label = tk.Label(frame_statusbar, text = "StatusLabel")
        # ラベルをフレームに配置
        label.pack(side = tk.LEFT)
        # ステータスバーをウィンドの下に配置
        frame_statusbar.pack(side = tk.BOTTOM, fill = tk.X)

        #---------------------------------------
        #  右カラム
        #---------------------------------------
        # 右カラム用Frame
        frame_column = tk.Frame(self.master, relief = tk.SUNKEN, bd = 2, width = 100)
        frame_column.propagate(False) # フーレムサイズの自動調整を無効にする
        # チェックボタン
        check1 = tk.Checkbutton(frame_column, text = "Check1")
        check2 = tk.Checkbutton(frame_column, text = "Check2")
        check3 = tk.Checkbutton(frame_column, text = "Check3")
        # チェックボタンをフレームに配置
        check1.pack()
        check2.pack()
        check3.pack()
        # 右カラムをウィンドの右に配置
        frame_column.pack(side = tk.RIGHT, fill = tk.Y)

        #---------------------------------------
        #  残りの領域
        #---------------------------------------
        frame = tk.Frame(self.master, relief = tk.SUNKEN, bd = 2, bg = 'dark cyan')
        frame.pack(expand = True, fill = tk.BOTH)

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

ポイント

  • 枠線の種類(relief)を指定するときは、枠線の太さ(bd)も指定する事。(枠線の太さは初期値が0のため)
  • Frameの幅(width)もしくは高さ(height)を数値で指定したいときは、
    フレーム.propagate(False)メソッドを呼ぶこと。
    propagate()を呼ばない場合、フレーム内のウィジェットに合わせてサイズが自動調整されます。
  • Frameを残りの領域全体に広げたい場合はpack時にexpand = True, fill = tk.BOTHの両方を指定すること

オプション

オプション名 説明
bd 枠線の太さを指定します。(borderwidthと同じ)
borderwidth bdと同じ
bg 背景色を指定します。(backgroundと同じ)
background bgと同じ
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
height フレームの高さを画素数で指定します。
highlightbackground
highlightcolor
highlightthickness
padx フレームの内側に配置するウィジェットまでの横方向の隙間を指定します。
【初期値】0
pady フレームの内側に配置するウィジェットまでの縦方向の隙間を指定します。
【初期値】0
relief ボタンのスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
takefocus
width フレームの幅を画素数で指定します。
wraplength 文字の折り返し幅を指定します。

 

【Python/tkinter】Menu(メニュー)

ウィンドウにメニューを追加するには、Menuクラスを用います。

メニューで良く使いそうな機能のサンプルプログラムを作成しました。

(実行画面)

ファイル関連のメニュー

表示メニュー(チェックボタンで作成しています)

選択メニュー(ラジオボタンで作成しています)

(サンプルプログラム)

import tkinter as tk
from tkinter import filedialog

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
        self.pack()

        self.master.title("メニューの作成")       # ウィンドウタイトル
        self.master.geometry("300x150")     # ウィンドウサイズ(幅x高さ)
        
        # ------------------------------------------------
        # メニューの作成

        # メニューバーの作成
        menubar = tk.Menu(self)

        # ファイル
        menu_file = tk.Menu(menubar, tearoff = False)
        menu_file.add_command(label = "ファイルを開く",  command = self.menu_file_open_click,  accelerator="Ctrl+O")
        menu_file.add_command(label = "名前を付けて保存", command = self.menu_file_saveas_click, accelerator="Ctrl+S")
        menu_file.add_separator() # 仕切り線
        menu_file.add_command(label = "終了",            command = self.master.destroy)
        # ショートカットキーの関連付け
        menu_file.bind_all("<Control-o>", self.menu_file_open_click)
        menu_file.bind_all("<Control-s>", self.menu_file_saveas_click)

        # 表示(Checkbutton)
        menu_disp = tk.Menu(menubar, tearoff = False)
        self.disp1_value = tk.BooleanVar()
        self.disp2_value = tk.BooleanVar()
        self.disp3_value = tk.BooleanVar()
        menu_disp.add_checkbutton(label = "表示1", command = self.menu_disp1_click, variable = self.disp1_value)
        menu_disp.add_checkbutton(label = "表示2", command = self.menu_disp2_click, variable = self.disp2_value)
        menu_disp.add_checkbutton(label = "表示3", command = self.menu_disp3_click, variable = self.disp3_value)

        # 選択(Radiobutton)
        self.radio_val = tk.IntVar() # ラジオボタンの値
        menu_select = tk.Menu(menubar, tearoff = False)
        menu_select.add_radiobutton(label = "選択1", command = self.menu_select_click, variable = self.radio_val, value = 1)
        menu_select.add_radiobutton(label = "選択2", command = self.menu_select_click, variable = self.radio_val, value = 2)
        menu_select.add_radiobutton(label = "選択3", command = self.menu_select_click, variable = self.radio_val, value = 3)

        # メニューバーに各メニューを追加
        menubar.add_cascade(label="ファイル", menu = menu_file)
        menubar.add_cascade(label="表示",     menu = menu_disp)
        menubar.add_cascade(label="選択",     menu = menu_select)

        # 親ウィンドウのメニューに、作成したメニューバーを設定
        self.master.config(menu = menubar)

    def menu_file_open_click(self, event=None):
        print("「ファイルを開く」が選択された")
        filename = filedialog.askopenfilename(
            title = "ファイルを開く",
            initialdir = "./" # 自分自身のディレクトリ
            )
        print(filename)

    def menu_file_saveas_click(self, event=None):
        print("「名前を付けて保存」が選択された")

    def menu_disp1_click(self):
        print("「表示1」が選択された")
        print(f"チェック状態は{self.disp1_value.get()}")

    def menu_disp2_click(self):
        print("「表示2」が選択された")
        print(f"チェック状態は{self.disp2_value.get()}")

    def menu_disp3_click(self):
        print("「表示3」が選択された")
        print(f"チェック状態は{self.disp3_value.get()}")

    def menu_select_click(self):
        print(self.radio_val.get(), "番目のラジオボタンが選択されました。")

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

ポイント

  • プルダウンで表示されるメニューが1つのMenuクラスオブジェクトとなり、各メニューの項目はadd_command()メソッドで追加します。
  • Menuクラスオブジェクトを親のMenuに追加するときは、add_cascade()メソッドを用います。

Menuクラスオプション

オプション名 説明
activebackground マウスポインタが各メニューの上にあるときの背景色を指定します。
activeborderwidth
選択されたメニューの枠の太さを指定します???
実質的にメニューの行間が広がります。
activeforeground マウスポインタが各メニューの上にあるときの文字色を指定します。
background 通常時の背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。(指定できない?)
bg backgroundと同じ
bitmap モノクロのBitmapを指定します。
(参考)https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/bitmaps.html
borderwidth bdと同じ
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。(指定できない?
disabledforeground add_command()メソッドで追加したメニューのstateオプションで無効(DISABLED)に設定している際の文字色を設定します。
fg add_command()メソッドで追加したメニューの文字色を設定します。
foreground fgと同じ
relief ボタンのスタイルを指定します。(指定できない?
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
selectcolor チェックボックス(チェックのある四角)の背景色を指定します。(指定できない?
takefocus
tearoff 必ずFalse(0)を指定します。
指定しない場合、破線が表示されます。
tearoffcommand
title
type

メソッド

メソッド 説明
add_command() メニュー項目を追加します。
add_radiobutton() ラジオボタンを追加します。(ただし、見た目はチェックボタンと同じ)
add_checkbutton() チェックボタンを追加します。
add_cascade() 親のMenuにMenuクラスオブジェクトを追加します。
add_separator() 仕切り線を追加します。
add( type, options )
delete( startindex [, endindex ]) メニューの項目をstartindex ~(endindex )まで削除します。
entryconfig( index, options ) メニューのindex番号を指定して、オプション設定値を設定、変更します。
index(item) メニューの文字列を指定してindex番号を取得します。
insert_separator ( index ) 指定した番号の位置に仕切り線を挿入します。
invoke ( index ) チェックボックスの場合、チェックの選択/非選択状態が切り替わります。
ラジオボタンの場合、選択されている項目が切り替わります。
type ( index ) 指定した番号のタイプを取得します。
cascade,  checkbutton,  command,  radiobutton,  separator, tearoff のいづれか

(補足)

メニューのindex番号ですが、私の環境では、上のメニューの番号は1から始まり、

ドロップダウンで表示されるメニューは0始まりとなっていました。

念のためindex()メソッドで、メニューの文字列指定でindex番号を取得した方が安全かも?しれません。

【Python/tkinter】Radiobutton(ラジオボタン)

ラジオボタンはRadiobuttonクラスによって作成します。

チェックボタンでは他のチェックボタンとは関係なくチェック/チェック無しの状態が選べましたが、ラジオボタンは複数のラジオボタンの中から1つだけ選択する場合に用いられます。

 

以下に簡単なサンプルを示します。

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)

        self.master.title("ラジオボタンの作成")     # ウィンドウタイトル
        self.master.geometry("300x150")             # ウィンドウサイズ(幅x高さ)

        # ラジオボタンの値
        self.radio_value = tk.IntVar(value = 1)     # 初期値を設定する場合
        #self.radio_value = tk.IntVar()             # 初期値を設定しないと0になる
        
        # ラジオボタンの作成
        radio0 = tk.Radiobutton(self.master, 
                           text = "ラジオボタン0",      # ラジオボタンの表示名
                           command = self.radio_click,  # クリックされたときに呼ばれるメソッド
                           variable = self.radio_value, # 選択の状態を設定する
                           value = 0                    # ラジオボタンに割り付ける値の設定
                           )

        radio1 = tk.Radiobutton(self.master, 
                           text = "ラジオボタン1",      # ラジオボタンの表示名
                           command = self.radio_click,  # クリックされたときに呼ばれるメソッド
                           variable = self.radio_value, # 選択の状態を設定する
                           value = 1                    # ラジオボタンに割り付ける値の設定
                           )

        radio2 = tk.Radiobutton(self.master, 
                           text = "ラジオボタン2",      # ラジオボタンの表示名
                           command = self.radio_click,  # クリックされたときに呼ばれるメソッド
                           variable = self.radio_value, # 選択の状態を設定する
                           value = 2                    # ラジオボタンに割り付ける値の設定
                           )

        # ボタンの作成
        button = tk.Button(self.master, 
                           text = "ラジオボタンの選択を次へ",  # ボタンの表示名
                           command = self.button_click  # クリックされたときに呼ばれるメソッド
                           )

        # 配置
        radio0.pack()
        radio1.pack()
        radio2.pack()
        button.pack()

    def radio_click(self):
        # ラジオボタンの値を取得
        value = self.radio_value.get()
        print(f"ラジオボタンの値は {value} です")

    def button_click(self):
        # 選択されているラジオボタンを次に移動させる
        value = self.radio_value.get()
        self.radio_value.set((value + 1) % 3)

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

(実行結果)

ポイント

  • ラジオボタンの値(選択されたときの識別番号)はIntVarクラスオブジェクトをRadiobuttonクラスのvariableオプションに設定する
  • 1つだけ選択される複数のラジオボタンには、それぞれ、同じIntVarクラスオブジェクトをvariableオプションに設定する
  • 各ラジオボタンの値(選択されたときの識別番号)はRadiobuttonクラスのvalueオプションに設定しておく
  • 選択されているラジオボタンの値(valueオプションで指定した値)は IntVarクラスオブジェクト.get() で行う
  • 選択されているラジオボタンを変更するには IntVarクラスオブジェクト.set() の引数にラジオボタンの値(valueオプションで指定した値)を指定します。

オプション

オプション名 説明
activebackground クリックされたときの背景色を指定します。
activeforeground クリックされたときの文字色(チェックマークを含む)を指定します。
anchor 文字の配置位置を指定します。
【設定値】tk.N, tk.S, tk.W, tk.E, tk.NW, tk.NE, tk.SW, tk.SE, tk.CENTER
【初期値】tk.CENTER
※width, heightを指定し、余白が生じている際に有効です。
background 通常時(クリックされていないとき)の背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。
ただし、初期状態では枠線が表示されていないため、reliefで枠線のスタイルを指定する必要があります。(borderwidthと同じ)
bg backgroundと同じ
bitmap モノクロのBitmapを指定します。
(参考)https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/bitmaps.html
borderwidth bdと同じ
command ボタンがクリックされたときに呼び出すメソッドの名前を指定します。
compound 文字と画像の両方を表示する際に、文字に対して画像の表示位置を指定します。
【設定値】tk.LEFT, tk.RIGHT, tk.BOTTOM, tk.TOP, tk.CENTER
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
disabledforeground stateオプションで無効(DISABLED)に設定している際の文字色を設定します。
fg 表示する文字色を指定します。(foregroundと同じ)
font 表示する文字のフォントを指定します。
foreground fgと同じ
height ボタンの高さを文字数で指定します。
画像を配置した時は、画素数の指定になります。
highlightbackground
highlightcolor
highlightthickness
image 表示する画像を指定します。
indicatoron
justify 複数行の文字のときの、文字寄せ方向を指定します。
【設定値】左寄せ(tk.LEFT), 中央寄せ(tk.CENTER), 右寄せ(tk.RIGHT)
offrelief
overrelief ウィジェット上にマウスポインタがある際のスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
padx 文字の両側の隙間を指定します。
pady 文字の上下の隙間を指定します。
relief ボタンのスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
selectcolor チェックボックス(チェックのある四角)の背景色を指定します。
selectimage
state ウィジェットの有効/無効(操作できない状態)を指定します。
【設定値】tk.NORMAL, tk.DISABLED
【初期値】tk.NORMAL
takefocus
text 表示する文字を指定します。
textvariable
tristateimage
tristatevalue
underline 指定した順番(先頭から0始まり)の文字にアンダーラインを付加します。
value ラジオボタンの値(選択されたときの識別番号)
variable チェックの状態をBooleanVarクラスオブジェクトで指定します。
width ボタンの幅を文字数で指定します。
画像を配置した時は、画素数の指定になります。
wraplength 文字の折り返し幅を指定します。

メソッド

メソッド 説明
deselect() 選択状態のとき、同じvariableオプションを設定している他のラジオボタンも全て選択状態になります。(詳細不明。。)
flash() backgroundとactivebackgroundで交互に色を点滅させて表示します。
invoke() 選択状態にします。
select() 選択状態にします。

【Python/tkinter】Checkbutton(チェックボックス)

チェックボタン(チェックボックス)はCheckbuttonクラスによって作成します。

以下にサンプルを示します。

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)

        self.master.title("チェックボックスの作成")       # ウィンドウタイトル
        self.master.geometry("300x100")                 # ウィンドウサイズ(幅x高さ)

        # チェックボックスの値
        self.check_value = tk.BooleanVar(value = True)  # 初期値を設定する場合
        #self.check_value = tk.BooleanVar()             # 初期値を設定しないとFlaseになる
        # チェックボックスの作成
        self.check = tk.Checkbutton(self.master, 
                           text = "チェックボックス",    # チェックボックスの表示名
                           command = self.check_click,  # クリックされたときに呼ばれるメソッド
                           variable = self.check_value  # チェックの状態を設定する
                           )

        # ボタンの作成
        button = tk.Button(self.master, 
                           text = "チェックを逆にする",  # ボタンの表示名
                           command = self.button_click  # クリックされたときに呼ばれるメソッド
                           )
        # 配置
        self.check.pack()
        button.pack()

    def check_click(self):
        # チェックの状態を取得(チェックされているときはTrue)
        value = self.check_value.get()
        print(f"チェックの状態は {value} です")

    def button_click(self):
        # チェックの状態を取得し逆に設定する
        value = self.check_value.get()
        self.check_value.set(not value)
        #以下のようにしても同じ
        #self.check.toggle()


if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

(実行結果)

ポイント

  • チェックボタンの値(チェックされている(True)/されていない(False))はBooleanVarクラスオブジェクトをCheckbuttonクラスのvariableオプションに設定する
  • チェックの状態の取得は BooleanVarクラスオブジェクト.get() で行う
  • チェックの状態の設定は BooleanVarクラスオブジェクト.set() の引数にTrue もしくは False を渡す

オプション

オプション名 説明
activebackground クリックされたときの背景色を指定します。
activeforeground クリックされたときの文字色(チェックマークを含む)を指定します。
anchor 文字の配置位置を指定します。
【設定値】tk.N, tk.S, tk.W, tk.E, tk.NW, tk.NE, tk.SW, tk.SE, tk.CENTER
【初期値】tk.CENTER
※width, heightを指定し、余白が生じている際に有効です。
background 通常時(クリックされていないとき)の背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。
ただし、初期状態では枠線が表示されていないため、reliefで枠線のスタイルを指定する必要があります。(borderwidthと同じ)
bg backgroundと同じ
bitmap モノクロのBitmapを指定します。
(参考)https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/bitmaps.html
borderwidth bdと同じ
command ボタンがクリックされたときに呼び出すメソッドの名前を指定します。
compound 文字と画像の両方を表示する際に、文字に対して画像の表示位置を指定します。
【設定値】tk.LEFT, tk.RIGHT, tk.BOTTOM, tk.TOP, tk.CENTER
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
disabledforeground stateオプションで無効(DISABLED)に設定している際の文字色を設定します。
fg 表示する文字色を指定します。(foregroundと同じ)
font 表示する文字のフォントを指定します。
foreground fgと同じ
height ボタンの高さを文字数で指定します。
画像を配置した時は、画素数の指定になります。
highlightbackground
highlightcolor
highlightthickness
image 表示する画像を指定します。
indicatoron
justify 複数行の文字のときの、文字寄せ方向を指定します。
【設定値】左寄せ(tk.LEFT), 中央寄せ(tk.CENTER), 右寄せ(tk.RIGHT)
offvalue チェックが無い時の値をTrue, Falseで指定します。
【初期値】False
onvalue チェックがある時の値をTrue, Falseで指定します。
【初期値】True
overrelief ウィジェット上にマウスポインタがある際のスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
padx 文字の両側の隙間を指定します。
pady 文字の上下の隙間を指定します。
relief ボタンのスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
selectcolor チェックボックス(チェックのある四角)の背景色を指定します。
selectimage
state ウィジェットの有効/無効(操作できない状態)を指定します。
【設定値】tk.NORMAL, tk.DISABLED
【初期値】tk.NORMAL
takefocus
text 表示する文字を指定します。
textvariable
tristateimage
tristatevalue
underline 指定した順番(先頭から0始まり)の文字にアンダーラインを付加します。
variable チェックの状態をBooleanVarクラスオブジェクトで指定します。
width ボタンの幅を文字数で指定します。
画像を配置した時は、画素数の指定になります。
wraplength 文字の折り返し幅を指定します。

 

メソッド

メソッド 説明
deselect() チェックなし状態にします。
flash() backgroundとactivebackgroundで交互に色を点滅させて表示します。
invoke()
select() チェックあり状態にします。
toggle() チェックのあり/なしを逆に設定します。

 

【Python】本家ドキュメントリンク集

Pythonを勉強していて、何か分からなかった時、Googleで検索すればだいたいの情報は出てくると思いますが、とりあえず本家のページで確認して、正しい情報を知りたい!という事で、本家ページのリンク集です。

(随時更新予定です)

 

モジュール 概要
Python(日本語) Pythonのリファレンス、チュートリアルなど
math 数値の切り捨て、切り上げ、絶対値やSin, Cos, PI など
tkinter ウィンドウGUIのリファレンスチュートリアルなど
os 環境変数、ファイルパスの操作(ファイル名、ディレクトリの取得など)
matplotlib
データの可視化、数値データのグラフ表示、画像の表示など
numpy データ配列、乱数、FFT、行列演算など
PIL(pillow) 画像ファイルを開く、保存、画像データの変換など

【Python/tkinter】ファイルを開くダイアログボックスの表示

ファイルを開くダイアログボックスを表示するには、tkinter.filedialogモジュールのaskopenfilename()関数を使います。

以下にシンプルなサンプルプログラムを示します。

from tkinter import filedialog

filename = filedialog.askopenfilename()
print(filename)

(実行結果)

オプション

オプション名 説明
parent ダイアログを表示する親のウィンドウを指定します。
title ダイアログのタイトルを指定します。
initialdir 最初に表示されるディレクトリを指定します。
initialfile 最初に選択されているファイル名を指定します。
filetypes 選択可能なファイルの種類を設定します。
multiple 複数ファイルの選択を許可する場合はTrueを、そうでない場合はFalseを指定します。

(参考)

https://docs.python.org/ja/3/library/dialog.html?highlight=askopenfilename#module-tkinter.filedialog

サンプル

実際に、このダイアログを使用する場合には、title, initialdir, filetypesの3つは指定しておいた方が良いでしょう。

以下に私がよく使うパターンのサンプルを示します。

from tkinter import filedialog

filename = filedialog.askopenfilename(
    title = "画像ファイルを開く",
    filetypes = [("Image file", ".bmp .png .jpg .tif"), ("Bitmap", ".bmp"), ("PNG", ".png"), ("JPEG", ".jpg"), ("Tiff", ".tif") ], # ファイルフィルタ
    initialdir = "./" # 自分自身のディレクトリ
    )
print(filename)

(実行結果)

関連記事

【Python/tkinter】名前を付けて保存ダイアログボックスの表示

【Python/os】カレントディレクトリの取得/設定

カレントディレクトリを取得/設定するにはosモジュールgetcwd() および chdir() を用います。

getcwd カレントディレクトリの取得
chdir カレントディレクトリの設定

 

以下に、カレントディレクトリの取得/設定を繰り返したサンプルを示します。

import os

# カレントディレクトリの取得
current = os.getcwd()
print(current)

# カレントディレクトリの設定(一つ上)
os.chdir("../")

# カレントディレクトリの取得
current = os.getcwd()
print(current)

# カレントディレクトリの設定(直接パスの指定)
os.chdir("c:\\Temp")

# カレントディレクトリの取得
current = os.getcwd()
print(current)

(実行結果)

【Python/tkinter】メッセージボックス

メッセージボックスには、OKボタンが1つのメッセージボックスやOKボタン/Cancelボタンがあるものなど、いくつかのバリエーションがありますが、これらの種類は関数名で切り替えます。

 

まずは、以下のサンプルを実行して頂くと雰囲気がつかめると思います。

from tkinter import messagebox

ret = messagebox.showinfo(
    title = "タイトル",
    message = "showinfoで表示されるメッセージ")
print("showinfoの戻り値:\t", ret)

ret = messagebox.showwarning(
    title = "タイトル",
    message = "showwarningで表示されるメッセージ")
print("showwarningの戻り値:\t", ret)

ret = messagebox.showerror(
    title = "タイトル",
    message = "showerrorで表示されるメッセージ")
print("showerrorの戻り値:\t", ret)

ret = messagebox.askokcancel(
    title = "タイトル",
    message = "askokcancelで表示されるメッセージ")
print("askokcancelの戻り値:\t", ret)

ret = messagebox.askyesno(
    title = "タイトル",
    message = "askyesnoで表示されるメッセージ")
print("askyesnoの戻り値:\t", ret)

ret = messagebox.askretrycancel(
    title = "タイトル",
    message = "askretrycancelで表示されるメッセージ")
print("askretrycancelの戻り値:", ret)

ret = messagebox.askquestion(
    title = "タイトル",
    message = "askquestionで表示されるメッセージ")
print("askquestionの戻り値:\t", ret)

ret = messagebox.askyesnocancel(
    title = "タイトル",
    message = "askyesnocancelで表示されるメッセージ")
print("askyesnocancelの戻り値:", ret)

 

関数名 メッセージボックス 戻り値
showinfo ok
showwarning ok
showerror ok
askokcancel True, False
askyesno True, False
askretrycancel True, False
askquestion yes, no
askyesnocancel True, False, None