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

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

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

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

Tkinter

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

Q&A

解決済

1回答

3211閲覧

Tkinterを使用してアクティブなEntryの取得方法を教えてください

tatsu0117

総合スコア11

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2020/03/02 06:19

編集2020/03/02 07:41

Tkinterでの現在アクティブなEntryの取得

初めまして。Python初心者で勉強中です。
現在色々なサイトを参考にてTkinterを使用して表形式の入力アプリを作成中です。
2列目にEntryでテキストボックスを作成し、アクティブなテキストボックス内でエンターが押されると
次の行が追加されるようにしたいと考えています。
その際、アクティブな行は新しく追加された行にもっていきたいと思っています。
現況のプログラムではバインドを使用してエンターを取得することはできたのですが、
常に2行目のEntryでエンターが押されない限り行の追加ができない状態となっております。

どのような方法を取ればアクティブなEntryが取得できるのかをご教示いただけますと幸いです。

該当のソースコード

python3

1import tkinter as tk 2from tkinter import ttk 3from tkinter import filedialog 4import pandas as pd 5from tkinter import * 6 7#入力用のGUI 8def GUI_Input(n): 9 root = tk.Tk() 10 root.title('Table Input') 11 12 #入力用フレーム 13 frame0 = ttk.Frame(root) 14 frame0.grid(row=0, column=0) 15 16 #項目をつくる 17 list_Labels = ['a', 'b', 'c','d','e','f','g','h','i','j'] 18 for i in range(0, len(list_Labels)): 19 label0 = ttk.Label(frame0, 20 text=list_Labels[i]) 21 label0.grid(row=0, column=i) 22 23 24 #項目1 25 for i in range(0, n): 26 label0 = ttk.Label(frame0, 27 text=i+1) 28 label0.grid(row=i+1, column=0) 29 #項目2 30 list_Items1 = [0] * n 31 for i in range(0, n): 32 list_Items1[i] = tk.StringVar() 33 entry_Item1 = ttk.Entry(frame0, 34 textvariable=list_Items1[i], 35 width=10) 36 entry_Item1.focus_set() 37 entry_Item1.grid(row=i+1,column=1) 38 #項目3 39 list_Items2 = [0] * n 40 for i in range(0, n): 41 list_Items2[i] = ttk.Combobox(frame0, 42 state='readonly', 43 width=10) 44 list_Items2[i]['values'] = ('a', 'b', 'c', 'd', 'e', 'f') 45 list_Items2[i].grid(row=i+1, column=2) 46 #項目4 47 list_Items3 = [0] * n 48 for i in range(0, n): 49 list_Items3[i] = tk.StringVar() 50 entry_Item3 = ttk.Entry(frame0, 51 textvariable=list_Items3[i], 52 width=10) 53 entry_Item3.grid(row=i+1,column=3) 54 #項目5 55 for i in range(0, n): 56 label1 = ttk.Label(frame0, 57 text=i+1,width=10,anchor='c') 58 label1.grid(row=i+1, column=4) 59 #項目6 60 for i in range(0, n): 61 label2 = ttk.Label(frame0, 62 text=i+1,width=10,anchor='c') 63 label2.grid(row=i+1, column=5) 64 #項目7 65 for i in range(0, n): 66 label3 = ttk.Label(frame0, 67 text=i+1,width=10,anchor='c') 68 label3.grid(row=i+1, column=6) 69 #項目8 70 for i in range(0, n): 71 label4 = ttk.Label(frame0, 72 text=i+1,width=10,anchor='c') 73 label4.grid(row=i+1, column=7) 74 #項目9 75 for i in range(0, n): 76 label5 = ttk.Label(frame0, 77 text=i+1,width=10,anchor='c') 78 label5.grid(row=i+1, column=8) 79 #項目10 80 for i in range(0, n): 81 label6 = ttk.Label(frame0, 82 text=i+1,width=10,anchor='c') 83 label6.grid(row=i+1, column=9) 84 y = 0 85 x = 2 86 print(x) 87 print(y) 88 def addText(event): 89 l1['text'] = int(l1['text']) + 1 90 t = int(l1['text']) 91 print(t) 92 for i in range(0, t): 93 label0 = ttk.Label(frame0,text=i+1) 94 label0.grid(row=i+1, column=0) 95 e = entry_Item1 96 e.bind("<Return>",addText) 97 l1 = ttk.Label(frame0,text=1) 98 root.mainloop() 99 100#nの数を変えて、初期の表の行数を変える 101n = 2 102GUI_Input(n)

試したこと

e = entry_Item1をアクティブな(現在カーソルがある位置)Entryに指定したいです。
eにどんな内容が入っているのか確認のためPrint(e)を実行すると
.!frame.!entry2
が入っていることがわかりました。
これをentry1にすればいけるのかとも思ったのですが、うまくいきません・・・
いくら調べても全然方法がわからず、もし不可であれば根本から変更することも考えております。
お力添えよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

アクティブなEntryに対して bind()を実行するのではなく、項目2を作成する段階で

Python

1 #項目2 2 list_Items1 = [0] * n 3 for i in range(0, n): 4 list_Items1[i] = tk.StringVar() 5 entry_Item1 = ttk.Entry(frame0, 6 textvariable=list_Items1[i], 7 width=10) 8 entry_Item1.focus_set() 9 entry_Item1.grid(row=i+1,column=1) 10 entry_Item1.bind("<Return>", addText) #全てのEntryにbind

のように全ての Entryに対して bind()を行います。

その上で、Callback関数内で

Python

1 def addText(event): 2 # イベントが発行された(<Return>が押された)Widgetを表示 3 print(event.widget) 4 # イベントが発行された(<Return>が押された)Widgetのグリッド位置 5 print(event.widget.grid_info()['row']) 6 7 # 以下行を追加する処理省略

のように、どこのEntryで <Return> が押されたのかを判定して、そのあとの処理を行う(必要に応じて処理を分ける)とよいのではないでしょうか。

投稿2020/03/02 10:24

magichan

総合スコア15898

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

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

tatsu0117

2020/03/02 13:18

ご回答いただきありがとうございます。 やりたい内容がピタッとできました! 本当にありがとうございます。 プログラム初心者の為またなにかとわからないことが出てくるかもしれませんが、 お力添えいただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問