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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

2490閲覧

[Python3.x]SpinboxでSpinUpやSpinDownのようなイベントがあるか知りたい

MM921

総合スコア14

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/04/05 07:55

編集2021/04/08 04:11

題名通り率直な質問になってしまいますが,お手柔らかにお願いいたします。

私は今,Excelを連動させた在庫管理GUIを作っています。

この時pythonにおけるspinboxのオプションを調べていましたが,spinboxの▲▼(アップダウン)ごとにイベントが発生するといったオプションが見つかりませんでした。

実際に行いたい動作の条件例は以下2つの通りです。

  • ▲を押してspinboxの値が1になったとき → True(text表示)
  • ▼を押してspinboxの値が1になったとき → False(text表示しない)
  • ▼を押してspinboxの値が0になったとき → False(textを消す)

上記のように,同じ1でも増加によるものと減少によるものとでイベントを起こせるかを知りたいです。
また,そのようなオプションがない場合は同様の動作がどのようにできるか知りたいです。

※以下は実際に使用しているコードです。

# -*- coding: utf-8 -*- import tkinter import openpyxl from tkinter import ttk from tkinter import * try: import tkinter as tk except: import tkinter as tk import tkinter.scrolledtext as st # ウィンドウの作成 window = tkinter.Tk() window.geometry("1358x750") window.title("Screen Transition") # 遷移前の画面の作成(画面1) canvas1 = tkinter.Canvas(bd=0, width=1366, height=768) canvas1.place(x=0, y=0) # キャンバス titleLabel1 = tk.Label(canvas1, text=" ※@で画面を閉じる ", font=('Helvetica', '13'), fg='gray8') titleLabel1.place(relx=0.85, rely=0.01) titleLabel2 = tkinter.Label(canvas1, text="こんにちは。前室在庫管理システムです。", font=('BIZ UDゴシック', '25', 'bold'), bg="misty rose", fg='firebrick4') # テキスト titleLabel2.place(relx=0.29, rely=0.25) titleLabel3 = tkinter.Label(canvas1, text="下記ボックスにカーソルを置いて,別紙の社員QRコードをかざしてログインしてください。", font=('BIZ UDゴシック', '15'), fg='gray4') # テキスト titleLabel3.place(relx=0.23, rely=0.35) titleLabel4 = tkinter.Label(canvas1, text="↓Name Here↓", font=('BIZ UDゴシック', '23'), fg='gray4') # テキスト titleLabel4.place(relx=0.42, rely=0.42) button = tkinter.Button(canvas1, text=" Go ", font=('BIZ UDゴシック', '15'), command=lambda: transition_button1(canvas1), fg='gray4') # 遷移ボタン button.place(relx=0.45, rely=0.53) entry1 = tkinter.Entry(canvas1, font=('Helvetica', '20')) # エントリーボックス entry1.place(relx=0.39, rely=0.47) # button実行結果 def transition_button1(widget): widget.place_forget() # canvas(widget)を隠す global entry1 # 遷移後の画面の作成(画面2) canvas2 = tkinter.Canvas(bd=0, width=1366, height=1500) # キャンバス canvas2.place(x=0, y=0) # Top Widget上に Scrollbar を生成して配置 bar = tk.Scrollbar(window, orient=tk.VERTICAL) bar.pack(side=tk.RIGHT, fill=tk.Y) # Scrollbarの設定 bar.config(command=canvas2.yview) # ScrollbarでCanvasを制御 # Canvas Widget をTopWidget上に配置 canvas2.config(yscrollcommand=bar.set) # Canvasのサイズ変更をScrollbarに通知 canvas2.config(scrollregion=(0, 0, 4800, 4800)) # スクロール範囲 canvas2.bind_all("<MouseWheel>", lambda eve: canvas2.yview_scroll(int(-eve.delta / 120), 'units')) canvas2.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # Frame Widgetを 生成 frame = tk.Frame(canvas2) # Frame Widgetを Canvas Widget上に配置() canvas2.create_window((0, 0), window=frame, anchor=tk.NW, width=1366, height=4800) # ブックを取得 book = openpyxl.load_workbook(r'C:\Users\mn-manabe\PycharmProjects\sample2Project\一覧備品.xlsx') sheet = book['Sheet1'] titleLabel_1 = tk.Label(canvas2, text=" 出庫したい備品の個数を指定して「出庫」ボタンを押してください。 ", font=('BIZ UDゴシック', '15'), bg="misty rose", fg='gray4') titleLabel_1.place(relx=0.43, rely=0.018) # これはとどめておく t0 = st.Text(width=90, height=40) t0.place(relx=0.48, rely=0.13) NameLabel = tkinter.Label(canvas2, text=entry1.get() + 'さんがログイン中です', font=('BIZ UDゴシック', '12'), fg='red') NameLabel.place(relx=0.43, rely=0.08) kakutei_button = tk.Button(canvas2, text=" 出 庫 ", font=('BIZ UDゴシック', '13'), fg='red', command=lambda: Kakutei(canvas2)) kakutei_button.place(relx=0.65, rely=0.87) Daimei_Label = tk.Label(canvas2, text="備品名 総個数 必要個数", font=('BIZ UDゴシック', '20'), fg='maroon') Daimei_Label.place(relx=0.03, rely=0.01) # Body f1 = open('excel行数.txt', 'w') print(sheet.max_row, file=f1) f1.close() f1 = open('excel行数.txt') data1 = f1.read() item1 = [] for cell in sheet['A']: item1.append(cell.value) item2 = [] for cell in sheet['B']: item2.append(cell.value) spinboxes = [] spinbox_values = [] for x in range(int(data1)): # name n = Label(frame, text=item1[x], font=('BIZ UDゴシック', '12')) n.place(x=50, y=36 * int(x) + 40) # namevalue v = Label(frame, text=item2[x], font=('BIZ UDゴシック', '12')) v.place(x=265, y=36 * int(x) + 40) val = StringVar() val.set('0') s = ttk.Spinbox( frame, format='%1.0f', state='readonly', textvariable=val, from_=0, to=5, ) s.place(x=365, y=36 * int(x) + 40) spinbox_values.append(val) spinboxes.append(val) print(spinboxes) def onIncrement(): print('増') sp = [int(s.get()) for s in spinboxes] print(sp) for x in range(int(data1)): if sp[x] > 0: itemname = sheet.cell(row=x + 1, column=1).value itemvalue = sheet.cell(row=x + 1, column=2).value if sp[x] == 1: t0.insert(tk.END, '{}:'.format(itemname)) t0.insert(tk.END, '{}\n'.format(itemvalue)) def onDecrement(event): print('減') sp = [int(s.get()) for s in spinboxes] print(sp) for x in range(int(data1)): if sp[x] > 0: itemname = sheet.cell(row=x + 1, column=1).value itemvalue = sheet.cell(row=x + 1, column=2).value if sp[x] == 1: pass s.bind("<<Increment>>", onIncrement) s.bind("<<Decrement>>", onDecrement) def Kakutei(widget): sp = [int(s.get()) for s in spinboxes] for x in range(int(data1)): if sp[x] > 0: itemvalue = sheet.cell(row=x + 1, column=2).value total = itemvalue - sp[x] sheet.cell(row=x + 1, column=2).value = total book.save(r'C:\Users\mn-manabe\PycharmProjects\sample2Project\一覧備品.xlsx') book.close() def transition_button2(widget): canvas2.pack_forget() bar.destroy() canvas1.place(x=0, y=0) # キャンバス if __name__ == "__main__": # @で画面を閉じる def process_b(): sys.exit() def key(event): if event.char == "@": process_b() window.bind("<Key>", key) window.focus_set() window.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

tkinter.Spinbox ではなく tkinter.ttk.Spinbox の利用をお勧めします

python

1import tkinter as tk 2from tkinter import ttk 3 4def onIncrement(event): 5 print(event) 6 7def onDecrement(event): 8 print(event) 9 10root = tk.Tk() 11spin = ttk.Spinbox(root) 12spin.bind("<<Increment>>", onIncrement) 13spin.bind("<<Decrement>>", onDecrement) 14spin.pack() 15root.mainloop()

投稿2021/04/05 10:28

teamikl

総合スコア8760

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

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

MM921

2021/04/08 04:09

teamiklさん返信が遅れてしまい申し訳ありません。 ご提案いただいたコードをもとに作成してみましたが,以下の動作がうまく動作しません。 質問文を訂正し,コードを掲載します。 ①▲を押してspinboxの値が1になったとき → True(text表示) ②▼を押してspinboxの値が1になったとき → False(text表示しない) spinboxの値が同じ1だと使い分けは難しいのでしょうか? ①の動作はできましたが,②の動作は動かない様子です。
teamikl

2021/04/08 05:12

コードを実行できないので、問題点を絞る為に、 openpyxl等は使わず、スピンボックスのみで問題が再現するコードを作ってください。 (動作確認の為にエクセルファイルを用意しなければならず、 ファイルの内容次第で実際の挙動が変わる可能性があるので、 質問用に問題点を切り分けたコードの作成をお勧めします) 見た感じでは (1) onIncrement -> 引数が最低限一つは必要なはずです。 (2) onIncrement, onDecrement の定義位置 for 文の中ではウィジェットの数だけ関数が作成されます。→ for 文の外に出す。 イベントハンドラ内からの spinbox ウィジェット参照は event.widget で参照できます。 (3) s.get() の値。コードが実行されているのは「値の変化前」な点に注意。 ※ イベントハンドラの関数内で return "break" とすると、値の増減をキャンセルできます。 複数のスピンボックスの値を参照してますが、 イベントハンドラの実行されてるウィジェットだけは、変化前の値です。 (1) は、エラーになるので写し間違えだと思いますが、 (3) が想定する動作と違っている等が考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問