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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

Q&A

解決済

1回答

848閲覧

「after関数」値を習得してないのに、次の行のコードが実行されてしまうのを直したい。

usann

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/12/10 08:11

前提・実現したいこと

「読み取りボタン」を押した際、code = repeat_barcode()でmyDataが呼び出される前にその下のprint("a")とStatic1["text"] = codeが実行されてしまいます。
codeにmyDataが入るまで、その下の処理が実行されないコードを作りたいです。

発生している問題・エラーメッセージ

def click(): code = 0 while code < 1: code = repeat_barcode() print("a") Static1["text"] = code など試してみましたがうまくいきませんでした。

該当のソースコード

python

1import sys 2import tkinter as tk 3from tkinter import ttk 4 5import os 6import time 7import numpy as np 8import pandas as pd 9from IPython import display 10from PIL import Image 11import cv2 12from datetime import datetime 13from pyzbar.pyzbar import decode 14 15box = [] 16after_id = None 17cap = cv2.VideoCapture(0) 18 19def click(): 20 code = repeat_barcode() 21 print("a") 22 Static1["text"] = code 23 24def repeat_barcode(): 25 print("ba-ko-do") 26 global after_id 27 global root 28 global cap 29 global box 30 #カメラから1コマのデータを取得する 31 ret,frame = cap.read() 32 for barcode in decode(frame): 33 #QRコードデータはバイトオブジェクトなので、カメラ上に描くために、文字列に変換する 34 myData = barcode.data.decode('utf-8') 35 print(myData) 36 box.append(myData) 37 if len(box) == 1: 38 return myData 39 after_id = root.after(100, repeat_barcode) 40 41def stop(): 42 global root 43 global after_id 44 root.after_cancel(after_id) 45 46root = tk.Tk() 47root.title(u"バーコード") 48root.geometry('400x400') 49button1 = tk.Button(root, text="読み取り", height=2,command=click) 50button1.pack(fill='x',padx=20,side='top') 51button2 = tk.Button(root, text="バーコード読み取りキャンセル",height=1, command=stop) 52button2.pack(fill='x',padx=20,side='top') 53Static1 = tk.Label(text=u'バーコード',font=("", 20)) 54Static1.pack(anchor='center',expand=1) 55root.mainloop()

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

after()は繰り返しではなく、一定時間後に指定の関数が呼び出されるのを予約して戻りますので、「code = repeat_barcode()」読み込んだデータをちぇっくした後は条件が合わなくても戻ります。

戻したくないのであれば、repeat_barcode() は条件が合うまでループするような作りにする必要があります。

投稿2021/12/10 14:50

TakaiY

総合スコア13790

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

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

usann

2021/12/11 03:46

ご回答ありがとうございます! def click(): code = 0 while code < 1: code = repeat_barcode() print("a") Static1["text"] = code 条件が合うまでこのようにループさせようとすると Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python3.9/tkinter/__init__.py", line 1892, in __call__ return self.func(*args) File "/home/pi/ラズパイ/000.py", line 31, in click while code < 1: TypeError: '<' not supported between instances of 'NoneType' and 'int' こんな感じでエラーが出てしまいます。 codeはint型にしているので比較できるはずなのですがエラーが起きてしまいます、、 またreturn myDataをreturn int(myData)にしても同じようなエラーが起きてしまいます。 条件が合うまでループどのようにコードを書けばうまく動いてくれるようになりますかね、、 アドバイスなどいだだければ幸いです!!
TakaiY

2021/12/11 08:55

エラーはちゃんと読むようにしたほうがいいですよ。 while code < 1: に対して出たエラーが TypeError: '<' not supported between instances of 'NoneType' and 'int' これですが、 '<' は NoneType(Noneのこと)とintで比較はできませんと言っています。 1はNoneではないので、codeがNoneです。 codeは、 code = repeat_barcode() の結果なので、repeat_barcode() がNoneを返すことがあるんでしょうね。 Noneの場合はどうすればいいか考えて対処する必要があるということでう。
usann

2021/12/13 07:30

while code is None: で解決することができました。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問