質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1283閲覧

Python Tkinter 撮影した画像の分析プログラムの実装方法

songyong

総合スコア21

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/15 16:51

編集2021/02/16 01:41

お世話になっております。Python初心者で食料品の検品プログラム作成にチャレンジしている者です。
Tkinterを初めて利用しているのですが、実装でつまづいてしまいました。

勉強不足・調査不足の面もございますが、是非有識者のみなさまの知恵をお借りしたいです。

やりたいことは、
まずカメラを起動し、写真とります。
その後、撮影した写真を分析するための関数に渡して、分析をかけます。
その結果をテキストボックスとして表示したいです。

2点質問させて頂きたいです。
①下記のソースコードを実行した場合に、分析のために定義している関数「analyze_image」が未定義とされてしまう原因と解決のための実装方法
②分析結果をテキストボックスに出力する方法

①下記のソースコードを実行した場合に、分析のために定義している関数「analyze_image」が未定義とされてしまう原因と解決のための実装方法
関数を定義しているのに、なぜでしょうか。。。 → クラスメソッドとして定義出来ていないため??
クラスメソッドとして定義する際の実装方法をご教示頂けますと幸甚です。

File "<ipython-input-1-e1d6fa968c2c>", line 109, in press_snapshot_button result = analyze_image(pic_name) NameError: name 'analyze_image' is not defined

②分析結果をテキストボックスに出力する方法
下記のコーディングで問題なく、テキストボックス内にanalyze_imageの戻り値が出力されますでしょうか。
また①と関連しますが、記載すべき場所がよく分かっておりません。

加えて、次の写真を撮った場合には、こちらの内容を削除してブランクの状態にしたいのですが、
どのように実装すれば良いでしょうか。

# 表示させたいがどこにどのようにプログラムを書けば良いかわからない self.text.insert(tk.END, result)

以上、拙い文書・初歩的な質問で大変恐縮ですが、
お助けいただけると幸甚です。。。

宜しくお願いします。

#ソースコード全体 import tkinter as tk from tkinter import ttk import cv2 import PIL.Image, PIL.ImageTk from tkinter import font from tkinter import filedialog import time class Application(tk.Frame): def __init__(self,master, video_source=0): super().__init__(master) self.master.geometry("1250x1000") self.master.title("Tkinter with Video Streaming and Capture") # --------------------------------------------------------- # Font # --------------------------------------------------------- self.font_frame = font.Font( family="Meiryo UI", size=15, weight="normal" ) self.font_btn_big = font.Font( family="Meiryo UI", size=20, weight="bold" ) self.font_btn_small = font.Font( family="Meiryo UI", size=15, weight="bold" ) self.font_lbl_bigger = font.Font( family="Meiryo UI", size=45, weight="bold" ) self.font_lbl_big = font.Font( family="Meiryo UI", size=30, weight="bold" ) self.font_lbl_middle = font.Font( family="Meiryo UI", size=15, weight="bold" ) self.font_lbl_small = font.Font( family="Meiryo UI", size=12, weight="normal" ) # --------------------------------------------------------- # Open the video source # --------------------------------------------------------- self.vcap = cv2.VideoCapture( video_source ) self.width = self.vcap.get( cv2.CAP_PROP_FRAME_WIDTH ) self.height = self.vcap.get( cv2.CAP_PROP_FRAME_HEIGHT ) # --------------------------------------------------------- # Widget # --------------------------------------------------------- self.create_widgets() # --------------------------------------------------------- # Canvas Update # --------------------------------------------------------- self.delay = 15 #[mili seconds] self.update() def create_widgets(self): #Frame_Camera self.frame_cam = tk.LabelFrame(self.master, text = 'Camera', font=self.font_frame) self.frame_cam.place(x = 10, y = 10) self.frame_cam.configure(width = self.width -90, height = self.height - 50) self.frame_cam.grid_propagate(0) #Canvas self.canvas1 = tk.Canvas(self.frame_cam) self.canvas1.configure( width= self.width -90 , height=self.height - 100) self.canvas1.grid(column= 0, row=0,padx = 10, pady=10) # Frame_Button self.frame_btn = tk.LabelFrame( self.master, text='Control', font=self.font_frame ) self.frame_btn.place( x=10, y=680 ) self.frame_btn.configure( width=self.width - 90, height=120 ) self.frame_btn.grid_propagate( 0 ) #Snapshot Button self.btn_snapshot = tk.Button( self.frame_btn, text='Snapshot', font=self.font_btn_big) self.btn_snapshot.configure(width = 15, height = 1, command=self.press_snapshot_button) self.btn_snapshot.grid(column=0, row=0, padx=30, pady= 10) # Close Button self.btn_close = tk.Button( self.frame_btn, text='Close', font=self.font_btn_big ) self.btn_close.configure( width=15, height=1, command=self.press_close_button ) self.btn_close.grid( column=1, row=0, padx=20, pady=10 ) # Text Boxの書き方がよく分かりません。。。。 # テキストボックスの作成 txtbox = tk.Entry(width=150) txtbox.place(x=37, y=750) def update(self): #Get a frame from the video source _, frame = self.vcap.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame)) #self.photo -> Canvas self.canvas1.create_image(0,0, image= self.photo, anchor = tk.NW) self.master.after(self.delay, self.update) def analyze_img(self, pic_name): img_test = cv2.imread(pic_name, cv2.IMREAD_GRAYSCALE) result = "実装中" return result def press_snapshot_button(self): # Get a frame from the video source _, frame = self.vcap.read() frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pic_name = "frame-" + time.strftime( "%Y-%d-%m-%H-%M-%S")+ ".jpg" cv2.imwrite(pic_name, cv2.cvtColor( frame1, cv2.COLOR_BGR2RGB ) ) # analyze_imageが未定義のエラーになる result = analyze_img(pic_name) # 表示させたいがどこにどのようにプログラムを書けば良いかわからない self.text.insert(tk.END, result) def press_close_button(self): self.master.destroy() self.vcap.release() def main(): root = tk.Tk() app = Application(master=root)#Inherit app.mainloop() if __name__ == "__main__": main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2021/02/16 01:17

analyze_imageは関数でなくクラスメソッドです 「バランスよく表示できる」とはどういう意味でしょうか。綺麗に表示できるといった表現をされるのではなく、具体的な仕様をご提示いただいた方が回答が得られやすくなるかと思います。
songyong

2021/02/16 01:27

ご回答いただき、ありがとうございます。 関数とクラスメソッドの違いが理解できておりませんでした。 調べてみて、クラスメソッドの形式に記載を修正するようにします。 「バランスよく表示」について、おっしゃる通り、曖昧な質問でした。ご指摘ありがとうございます。 こちら自身で問題解決できましたので、削除させて頂きました。 また、質問の③(現在②)についてもコメントいただけますと幸いです。 写真分析をクラスメソッドで記載した場合、 テキストボックスへの出力記載の場所は、本文ソースコード内記載通りのものを、 「スナップショットボタン押下時」の処理の中に記載することで、動作できますでしょうか。 宜しくお願いします。
songyong

2021/02/16 01:37

関数 = 独立したもの クラスメソッド = クラスに従属する関数(クラス名.関数で呼び出しが必要) と理解しました。 実装としては、追加でクラスを作成し、その中にimage_analyze関数を定義する必要があるのでしょうか。。。 もし可能であれば、実装イメージをご教示頂けるとすごく助かります。 大変お手数ですが、宜しくお願いします。
guest

回答1

0

ベストアンサー

関数とクラスメソッドでは呼び出し方が違います。
関数:xxx()
クラスメソッド:self.xxx()

text内容をクリアする場合
https://stackoverflow.com/questions/2260235/how-to-clear-the-entry-widget-after-a-button-is-pressed-in-tkinter

投稿2021/02/16 01:57

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

songyong

2021/02/16 14:28

ご回答頂き、ありがとうございました! 無事、動かすことができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問