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

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

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

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

Tkinter

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

Q&A

解決済

1回答

393閲覧

ラベルの内容を書き換えたときに直前の値が残ってしまう

tami.py

総合スコア32

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/06/02 01:26

フォームを作ろうとしているのですが、コンボボックスで選択した値をラベルに転記をしています。
その際、長い単語(テストあり)を選択した後、短い単語(なし)を選択するとラベルに表示されるのが、”なし あり”こんな感じになってしまいます。
テストありを選択した後になしを選択したら、
なしだけ表示されるようになってほしいです。

python3.9.10

1import tkinter 2from tkinter import ttk 3from tkinter import Tk, font 4 5 6root = Tk() 7root.title("フォーム") 8root.geometry("400x350") 9 10# ここが問題になってるヶ所 11def class_show_selected(event): 12 txt6= tkinter.Label(text=class_combobox.get()) 13 txt6.place(x=20, y=250) 14 15 16# 画面を閉じる関数を与える 17def return_view(): 18 root.destroy() 19 20#各種ラベルの設定 21font1 = font.Font(size=10) 22LBL_1 = tkinter.Label(text='テストの選択:', font=font1) 23 24 25#プルダウンの中身を定義 26class_list =["テストあり","なし"] 27class_combobox = ttk.Combobox(values=class_list) 28class_combobox.bind('<<ComboboxSelected>>',class_show_selected,) 29 30 31#各種ラベル等の配置 32LBL_1.place(x=40, y=30) 33 34 35class_combobox.place(x=150, y=30) 36 37 38root.mainloop()

自分でもdeleteを使ってみたり、0や””を入れてみたり、ネットで上書き等で検索してみたりして探してみたのですが、エラーにはなれど、全く改善されません。

ご教授、よろしくお願いします。

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

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

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

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

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

tami.py

2022/06/02 01:42

今回は、ボタンを使わずにプルダウンを選択した時点でラベルの値を変更したいと思っています。
guest

回答1

0

ベストアンサー

問題点: tkinter.Label(...) は「ラベル表示」だと思われていそうですが
プログラム的には「ラベル・ウィジェットの生成」なので、
問題の関数では、新たなラベルウィジェットを毎回生成しています。

対処方法は幾つか有りますが、まずは A の方法を検討して見て下さい。
C, Dは紹介のみ。今回のケースでは適しておらずコードが無駄に複雑化します。

  • A. 生成済みのラベルの値を書き換える (label.config(text="ラベル"))
  • B. 変数を使って共有する (tkinter.StringVar について調べて見て下さい)
  • C. 生成前に前のウィジェットを破棄する (label.destroy())
  • D. 新たな生成を抑制する (tkinter.Label(..., name="labelName"))

python

1def class_show_selected(event): 2 LBL_1.config(text=class_combobox.get()) 3 LBL_1.place(x=20, y=250)

投稿2022/06/02 01:45

teamikl

総合スコア8664

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

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

tami.py

2022/06/02 03:46

早速のご教授ありがとうございました。 configを使うなど思いもしませんでした。 B・C・Dの処理方法は、ネットでちらっと出てきましたが、どれも僕のスキルではうまく処理できるようにできませんでした。 おかげで、最もすっきりとした形で処理ができました。 ありがとうございました。 今後ともよろしくお願いします。
tami.py

2022/06/02 03:48

、、、python3.9.10 import tkinter from tkinter import ttk from tkinter import Tk, font root = Tk() root.title("フォーム") root.geometry("400x350") # この部分を変更 def class_show_selected(event): class_label.config(text=class_combobox.get()) class_label.place(x=20, y=250) # 画面を閉じる関数を与える def return_view(): root.destroy() #各種ラベルの設定 font1 = font.Font(size=10) LBL_1 = tkinter.Label(text='テストの選択:', font=font1) #この部分を追加 class_label= tkinter.Label() #プルダウンの中身を定義 class_list =["テストあり","なし"] class_combobox = ttk.Combobox(values=class_list) class_combobox.bind('<<ComboboxSelected>>',class_show_selected,) #各種ラベル等の配置 LBL_1.place(x=40, y=30) class_combobox.place(x=150, y=30) root.mainloop() 、、、
tami.py

2022/06/02 03:55

変数等の名前の付け方、プログラムの配置等わかりにくいところがあり、申し訳ありませんでした。それもいい勉強になりました。
teamikl

2022/06/02 04:49

StringVar の使い方は、ウィジェットによりオプション名が異なる場合がありますが tkinterの変数となるオブジェクトを作成し、複数のウィジェットに設定します。 注目点は、このコードでは <<ComboboxSelected>> イベントの bind は不要で 選択された値が自動的にラベルに反映されます。 import tkinter as tk from tkinter import ttk root = tk.Tk() selected = tk.StringVar() ttk.Entry(root, textvar=selected).pack() ttk.Combobox(root, values=["A", "B", "C"], textvar=selected).pack() ttk.Label(root, textvar=selected).pack() root.mainloop()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問