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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Tkinter

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

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

6746閲覧

[python3]バーコードリーダーを用いてQRコードの内容(名前)の入力を行いたい

MM921

総合スコア14

Python 3.x

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

Tkinter

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

Python

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

PyCharm

エディター・開発ツール

1グッド

1クリップ

投稿2020/10/16 07:31

前提・実現したいこと

Python初心者です。
現在Python3(PyCharm)で簡単な在庫システムを作っています。
誰が備品を使ったか管理するために,一人一人の名前の情報が入ったQRコードをPythonで
作りましたが,このQRコードをPC上でなくバーコードリーダーを用いて読み取りたいです。

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

下記のコードでは名前入力の際,リストボックスを使っていますが,ここをバーコードリーダーで
QRコードでの読み取りに変更したいのです。
しかし調べてもPC上での読み取りしか見つからないので困っています。。。
↓該当部分です。

class StartPage(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, width=640, height=480) tk.Frame(width=640, height=480) self.variable = StringVar() tk.Label(self, text="NAME", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5) self.allnames = ["なまえ1", "なまえ2", "なまえ3", "なまえ4", "なまえ5","なまえ6"] names = StringVar(value=self.allnames) self.listbox = Listbox(self, listvariable=names, height=5, selectmode=EXTENDED) self.listbox.pack() ### 該当のソースコード

↓全文になります。

from tkinter import* import tkinter.ttk as ttk try: import tkinter as tk except: import tkinter as tk import datetime class SampleApp(tk.Tk): def __init__(self): tk.Tk.__init__(self) self._frame = None self.switch_frame(StartPage) self.variable = StringVar() self.width = 640 self.height = 480 self.geometry(str(self.width) + "x" + str(self.height)) # ウィンドウの作成 def switch_frame(self, frame_class): new_frame = frame_class(self) if self._frame is not None: self._frame.destroy() self._frame = new_frame self._frame.pack() class StartPage(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, width=640, height=480) tk.Frame(width=640, height=480) self.variable = StringVar() tk.Label(self, text="NAME", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5) self.allnames = ["なまえ1", "なまえ2", "なまえ3", "なまえ4", "なまえ5","なまえ6"] names = StringVar(value=self.allnames) self.listbox = Listbox(self, listvariable=names, height=5, selectmode=EXTENDED) self.listbox.pack() tk.Label(self, text="Start page", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5) ttk.Button(self, text="Go to page one", command=self.printValue).pack() def printValue(self): if len(self.listbox.curselection()) == 0: return index = self.listbox.curselection()[0] date = datetime.datetime.now() print(date.year, "年", date.month, "月", date.day, "日", date.hour, "時", date.minute, "分", date.second, "秒") self.entryvalue = StringVar() print(self.listbox.get(index), "さんこんにちは!") self.master.switch_frame(PageOne) class PageOne(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master) f1 = open('マジック赤.txt') f2 = open('マジック青.txt') data1 = f1.read() data2 = f2.read() f1.close() f2.close() self.entry1 = tk.Entry(width=15) self.entry1.place(x=180, y=60) self.entry1.insert(tk.END, data1) self.entry2 = tk.Entry(width=15) self.entry2.place(x=350, y=60) self.entry3 = tk.Entry(width=15) self.entry3.place(x=1000, y=1000) # 隠し中 self.entry4 = tk.Entry(width=15) self.entry4.place(x=180, y=90) self.entry4.insert(tk.END, data2) self.entry5 = tk.Entry(width=15) self.entry5.place(x=350, y=90) self.entry6 = tk.Entry(width=15) self.entry6.place(x=1000, y=1000) # 隠し中 self.label2 = tk.Label(text="備品個数", fg="black", font=("BIZ UDPゴシック", 15)) self.label2.place(x=180, y=25) self.label3 = tk.Label(text="必要個数", fg="black", font=("BIZ UDPゴシック", 15)) self.label3.place(x=350, y=25) self.label4 = tk.Label(text="備品名", fg="black", font=("BIZ UDPゴシック", 15)) self.label4.place(x=10, y=25) self.label4 = tk.Label(text="マジック", fg="black", font=("BIZ UDPゴシック", 13)) self.label4.place(x=10, y=60) self.label4 = tk.Label(text="赤", fg="red", font=("BIZ UDPゴシック", 13)) self.label4.place(x=73, y=60) self.label4 = tk.Label(text="マジック", fg="black", font=("BIZ UDPゴシック", 13)) self.label4.place(x=10, y=90) self.label4 = tk.Label(text="青", fg="blue", font=("BIZ UDPゴシック", 13)) self.label4.place(x=73, y=90) self.button2 = tk.Button(text="出庫する", command=self.button2Click, width=20, font=("BIZ UDPゴシック", 10)) self.button2.place(x=250, y=360) self.button3 = tk.Button(text="Go back to start page", command=self.button3Click, width=20, font=("BIZ UDPゴシック", 10)) self.button3.place(x=250, y=400) def button2Click(self): # ボタン1が押された時に呼ばれるメソッド if self.entry1.get() != "" and self.entry2.get() != "": self.entry3.delete(0, tk.END) self.entry3.insert(0, int(self.entry1.get()) - int(self.entry2.get())) # 計算結果をentry3に表示 if self.entry4.get() != "" and self.entry5.get() != "": self.entry6.delete(0, tk.END) self.entry6.insert(0, int(self.entry4.get()) - int(self.entry5.get())) # 計算結果をentry6に表示 v = int(self.entry1.get()) - int(self.entry2.get()) w = int(self.entry4.get()) - int(self.entry5.get()) print("残り在庫") print("マジック赤", v, "個") print("マジック青", w, "個") if self.entry3.get() != "" and self.entry6.get() != "": self.entry1.delete(0, tk.END) # 一旦全入力を消す self.entry2.delete(0, tk.END) self.entry3.delete(0, tk.END) self.entry4.delete(0, tk.END) self.entry5.delete(0, tk.END) self.entry6.delete(0, tk.END) self.entry1.insert(tk.END, v) self.entry4.insert(tk.END, w) f1 = open('マジック赤.txt', 'w') f2 = open('マジック青.txt', 'w') print(v, file=f1) print(w, file=f2) f1.close() f2.close() def button3Click(self): self.master.switch_frame(StartPage) if __name__ == "__main__": app = SampleApp() app.mainloop() ### 該当のソースコード

試したこと

実際にバーコードリーダーで読み取る用のライブラリを探しましたがPC上での読み取り方法しか見つけられませんでした。

Pythonをはじめて日は浅く,知識不足ゆえ何卒ご教示お願い致します。

teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

リストボックスは入力を受け付けないので、Entry もしくは、
リスト選択と任意の入力の両方を可能にするなら、
ttk.Combobox を使ってみてください。

バーコードリーダーで読み取る用のライブラリ

カメラから画像を所得してデコードするようなことをしないなら不要で、
直接任意のテキスト欄へ入力できるはずです。

関連:
Python3 Tkinter バーコードを使ってテキストボックスへ入力

投稿2020/10/16 08:16

teamikl

総合スコア8664

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

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

MM921

2020/10/19 00:26

teamiklさん,ご回答ありがとうございます。 実はリストボックスの前にteamiklさんがおっしゃっているコンボボックスを試しましたが,なにぶん様々な年齢層の方々が使用することが予想されるためPCの画面の欄から「選ぶ」というより紙からバーコードリーダーでQRコードを「読み取る」のほうがわかりやすいだろうということでコンボボックスは断念しました。。。せっかくご回答いただいたのに情報記載不足で本当に申し訳ありません。 これから使用する予定のバーコードリーダーはカメラではなく赤外線ビームでバーコードを読み取っていくタイプのものですが,この場合はQRコードをかざすだけで該当するテキスト欄へ入力できる,ということでしょうか?またそうでない場合はどのようにしたらよいのでしょうか?ご都合がよろしければまた返信を頂けると幸いです。
teamikl

2020/10/19 03:35 編集

実機を想定してなので、回答通りです。「リストからの選択」という機能を残したまま 「テキスト入力」も可能にする手段としてコンボボックスを挙げました。 リストが不要になるなら Entry でもよいです >この場合はQRコードをかざすだけで該当するテキスト欄へ入力できる, >ということでしょうか? (追記:エンコードされたデータはテキスト&キーボードインターフェースを想定です) プログラムでの扱い的にはキーボード入力を自動化したような動作になるので、 普通のテキスト欄を用意するだけで良いです。 カメラで撮った画像をデコード~ というQRコード読み取りのライブラリは不要です。 バーコードリーダー側の設定等は必要かもしれないので、 それについてはプログラム側ではなく、バーコードリーダー側の取説を調べて下さい。 バーコード「キーボードインターフェース」について https://www.barcode.ne.jp/questions/330.html >A: 読取ったバーコードのデータを、キーボードの信号として送信するインタフェースです。主に、PC(パーソナルコンピュータ、パソコン)に接続するときに使います。 > >PCからはキーボードとして認識されるため、専用の通信ソフトなどが不要です。読取ったデータは、あたかもキーボードで入力しているかのように、PCのカーソル位置に入力されます。 > >例えば、データ内容が『12345』というバーコードを読取った場合は、キーボードにて『1』『2』『3』『4』『5』と入力するのと同じです。
teamikl

2020/10/19 03:22

注意点としては、「テキスト欄にフォーカスが当たっている必要がある」のと 直接入力はできないようにしたいと readonly にしてしまうと、 (Tkinterの場合)入力が反映されない、等には配慮が必要になるかもしれません。 例えば、「フォーカスに関係なくバーコード読み取りを検出したい」 となると、入力欄のフォーカスを固定したり、 読み取り検出の為のサフィックス設定をして、 それを検出(回答内のリンクを参考)といった事も必要になってきます。
MM921

2020/10/19 07:18

teamiklさん,非常にわかりやすいご返信を頂きありがとうございます。 この後コンボボックスに置き換えてバーコードリーダーを当てて試してみたところ,QRコードの値がきちんと反映するようになりました。無事解決することができました。 お忙しいところ的確にわかりやすく教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問