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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1617閲覧

コンボボックス選択で動的にentry数を変更したい。

yoshi_gabbalove

総合スコア5

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2023/09/11 14:34

編集2023/10/11 13:05

実現したいこと

コンボボックス選択で動的にentryの数を変更したいです。

前提

コンボボックスでentry数を選べるようにしており、選ぶとその数通りにentryを増減したいのですが、実現できずにおります。

該当のソースコード

python

1from tkinter import * 2from tkinter import ttk 3 4def len_entry_change(event): 5global len_entry 6len_entry = kensuu_cbx_variable.get() 7 8root = Tk() 9 10len_entry = 10 11root_size_x = 150 12root_size_y = 20 + len_entry * 20 13entry_list = [] 14 15root.geometry(str(root_size_x)+"x"+str(root_size_y)) 16 17main_frame = Frame(root, width = root_size_x, height = root_size_y) 18main_frame.grid(row=0,column=0) 19 20for i in range(len_entry): 21entry_list.append(Entry(main_frame,width=20)) 22entry_list[i].grid(row=0 + i,column=0) 23 24kensuu_list = ['10','15','20'] 25kensuu_cbx_variable = StringVar() 26kensuu_combobox = ttk.Combobox(main_frame,values=kensuu_list,width=3,textvariable=kensuu_cbx_variable,justify=CENTER) 27kensuu_combobox.grid(row=1+i,column=0) 28kensuu_combobox.bind('<<ComboboxSelected>>',len_entry_change) 29kensuu_combobox.current(0) 30 31root.mainloop()

試したこと

ComboboxSelectedイベントでentry数を格納している変数(len_entry)の中身を変更しているのですが、entryの数が変わりません。

解決策を教えてください。
宜しくお願い致します。

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

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

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

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

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

y_waiwai

2023/09/12 00:19

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
yoshi_gabbalove

2023/10/11 13:06

コードの貼り方を知らないまま質問しておりました。申し訳ございません。以後気を付けます。
guest

回答1

0

ベストアンサー

len_entry は Python の数値を格納した変数なので、
この値を変更したからと言って、Entry の生成される個数が変わるわけではありません。
そのような挙動をする機能は、「データバインディング」といって
プロパティを変更すると自動的にそれを UI に反映する仕組みがあります。

tkinter では残念ながら自動的には行ってくれないので、
同様のことを行う為にはデータバインディング機能を提供するライブラリを使うか、
tkinter.Variable 系のtkitnerの提供する変数オブジェクトを用い
ウィジェットから変更の通知が得られるので、
そのイベント内で自前で任意の機能を実装することになります。

python

1 2import tkinter as tk 3from tkinter import ttk 4 5root = tk.Tk() 6num = tk.IntVar() 7combo = ttk.Combobox(root, textvar=num, values=list(range(5))) 8frame = tk.Frame(root) 9 10def on_num_changed(*_): 11 # frame上の子ウィジェットを全て削除 12 for widget in frame.winfo_children(): 13 widget.destroy() 14 15 # Entry 生成 16 for _ in range(num.get()): 17 tk.Entry(frame).pack() 18 19num.trace("w", on_num_changed) 20 21combo.pack() 22frame.pack() 23root.mainloop() 24

投稿2023/09/11 19:22

teamikl

総合スコア8817

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

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

yoshi_gabbalove

2023/10/11 13:11

widgetを全て削除してから再生成しないといけないのですね。教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問