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

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

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

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

Q&A

解決済

1回答

730閲覧

python tkinterで表示させた表でEnterキーを押した際に次の行のセルに移るメソッドを教えてください。

mizumimizu

総合スコア28

Python

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

0グッド

0クリップ

投稿2023/05/05 11:30

実現したいこと

python tkinterで表示させた表でEnterキーを押した際に次の行のセルに移るメソッドを教えてください。

前提

Enterキーを押した際に次の行のセルに移るイベントメソッドを追加したいです。

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

エラーメッセージ

該当のソースコード

import pandas as pd import tkinter as tk from tkinter import ttk from tkinter import filedialog def Input(): root = tk.Tk() root.title('Lens Data Editor') frame = ttk.Frame(root) frame.grid(row=0, column=0) # 項目をつくる items = ['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効径'] for i in range(0, len(items)): label_item = ttk.Label(frame, text=items[i]) label_item.grid(row=0, column=i) n = 20 # 行数 # 項目1 items1 = [0] * n for i in range(0, n): items1[i] = tk.StringVar() item1 = ttk.Entry(frame, textvariable=items1[i], width=10) item1.grid(row=i+1, column=0) item1.insert(i, i) # 項目2 items2 = [0] * n for i in range(0, n): items2[i] = tk.StringVar() item2 = ttk.Entry(frame, textvariable=items2[i], width=10) item2.grid(row=i+1, column=1) # 項目3 items3 = [0] * n for i in range(0, n): items3[i] = tk.StringVar() item3 = ttk.Entry(frame, textvariable=items3[i], width=10) item3.grid(row=i+1, column=2) # 項目4 items4 = [0] * n for i in range(0, n): items4[i] = tk.StringVar() item4 = ttk.Entry(frame, textvariable=items4[i], width=10) item4.grid(row=i+1, column=3) # 項目5 items5 = [0] * n for i in range(0, n): items5[i] = tk.StringVar() item5 = ttk.Entry(frame, textvariable=items5[i], width=10) item5.grid(row=i+1, column=4) # 実行ボタン def execute(): #これまでの入力をリストに入れる table_data = [] for i in range(0, n): table_data.append([items1[i].get(), items2[i].get(), items3[i].get(), items4[i].get(), items5[i].get()]) # pandas dataframeに変換 df = pd.DataFrame(table_data, columns=['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効径']) # 結果表示 Output(df) button = ttk.Button(root, text='計算', padding=5, command=execute) button.grid(row=1, column=0) root.mainloop() def Output(df): root = tk.Tk() root.title('Lens Data Output') frame = ttk.Frame(root, padding=5) frame.grid(row=0, column=0) # ツリービューの作成 tree = ttk.Treeview(frame) # 列インデックスの作成 tree['columns'] = (0,1,2,3,4) # 表スタイルの設定(headingsは通常の表形式) tree['show'] = 'headings' # 各列の設定(インデックス,オプション(今回は幅を指定)) for i in range(0,5): tree.column(i,width=100) # 各列のヘッダー設定(インデックス,テキスト) tree.heading(0, text='No.') tree.heading(1, text='曲率半径R') tree.heading(2, text='肉厚間隔T') tree.heading(3, text='硝材') tree.heading(4, text='有効径') for i in range(0, len(df)): item1 = df.iloc[i][0] item2 = df.iloc[i][1] item3 = df.iloc[i][2] item4 = df.iloc[i][3] item5 = df.iloc[i][4] # レコードの作成 # 1番目の引数-配置場所(表形式の表示ではブランクとする) # 2番目の引数-end:表の配置順序を最下部に配置 # (行インデックス番号を指定することもできる) # 3番目の引数-values:レコードの値をタプルで指定する tree.insert('', 'end', values=(item1, item2, item3, item4, item5)) # ツリービューの配置 tree.grid(row=0) # 保存ボタン def save(): fld = tk.filedialog.askdirectory(initialdir = 'C:') df.to_csv(fld + '/table.csv', encoding='shift-jis', index=False) button = ttk.Button(root, text='保存', command=save) button.grid(row=2, pady=5) root.mainloop() if __name__ == '__main__': Input()

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

Frame 上の全ての ttk.Entry ウィジェットにコールバック関数(move_to_next_row())をバインドするなど。

python

1 # 項目5 2 items5 = [0] * n 3 for i in range(0, n): 4 items5[i] = tk.StringVar() 5 item5 = ttk.Entry(frame, textvariable=items5[i], width=10) 6 item5.grid(row=i+1, column=4) 7 8 ## ここから 9 def move_to_next_row(event): 10 # current position 11 info = event.widget.grid_info() 12 r, c = info['row'], info['column'] 13 # number of rows 14 nrows = frame.grid_size()[1] 15 # move to next row 16 r = (r + 1) if r < nrows-1 else r 17 frame.grid_slaves(row=r, column=c)[0].focus_set() 18 19 for w in frame.winfo_children(): 20 if isinstance(w, ttk.Entry): 21 w.bind('<Return>', move_to_next_row) 22 23 ## ここまで 24 25 # 実行ボタン 26 def execute(): 27 #これまでの入力をリストに入れる

投稿2023/05/05 12:30

編集2023/05/05 12:46
melian

総合スコア19885

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

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

mizumimizu

2023/05/05 14:11

素晴らしい!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問