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

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

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

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

Q&A

解決済

1回答

425閲覧

python tkinter Labelについて質問です

vibrato

総合スコア52

Python

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

0グッド

0クリップ

投稿2018/05/11 18:19

編集2018/05/12 06:07

希望動作

○をクリックすると×が表示され、○×どちらをクリックしても同じ値を出力させたいのですが、
下記のコードだとそれが出来ません、

python

1size = 40 2def Callback(event): 3 labelB = tk.Label(root, text="×", textvariable=1, font=size) 4 labelB.place(x=size) 5 labelB.bind("<1>",Callback) 6 value = int(str(event.widget["textvariable"])) 7 print(value) 8 9labelA = tk.Label(root, text="○", textvariable=1, font=size) 10labelA.place(x=0) 11labelA.bind("<1>",Callback) 12 13tk.mainloop()

上記実行後 ○ をクリックすると
①:Callback内の × が表示されると思っていたのですが ○ が表示されます。
(○ をクリック後は × を表示させたい。)

②:Callback内の textvariable =1 を 他の値に変更すると × が表示されますが、
出力も他の値になってしまいます。

Callback前後で「表示は変更される」「出力は変更されない」
という動作を希望しています。

どのようにすれば可能でしょうか?
よろしく願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

textvariableに同じ値を指定しているからだと思います。

普通textvariableにはtkiner.StringVarのインスタンスを指定し、後からsetすることでラベルの表示テキストを変更するなんて場合に使うと思います。

変数の使い方については以下を参照しました。
https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/control-variables.html

Label

You can set its textvariable option to a StringVar. Then any call to the variable's .set() method will change the text displayed on the label. This is not necessary if the label's text is static; use the text attribute for labels that don't change while the application is running.

1はStringVarのインスタンスではないのですが、動きを見る限り、こんなふうに動いているように思えました(仕様書からこの動作を見つけられなかったので単なる想像です)

(A) 1がtextvariableに初めて指定されたとき
(A1) 初期テキストはtextオプションで決まる
(A2) 1に対応する内部的なStringVar(のようなもの?)が生成される
その値は(A1)の内容になる
(B) 他のラベルのtextvariableに1が指定されたとき
(B1) textオプションは無視される
(B2) 初期テキストは(A2)で生成されたStringVarの内容となる


追記:質問者さんがやりたいことが今一つピンときてはいないのですが、ウィジェットの標準的なプロパティとは別にアプリケーションで固有の情報をウィジェットに結び付けておきたいと解釈しました。どうするのがベストか自信ないですが、以下の例では「userOwnValue」という名前でアプリケーション固有情報をウィジェットの属性として直接設定してしまう例です。tkinter.Labelの派生クラスを定義してその中に__valueのようなtkinterと絶対に衝突しない名前を定義すると安全とは思いますがそこまで厳密にすべきかどうか自分にはわかりませんでした。

python

1import tkinter as tk 2 3 4root = tk.Tk() 5size = 40 6 7labelB = None 8 9 10def on_click_common(event): 11 print('text of clicked label =', event.widget['text']) 12 print('userOwnValue of the label =', event.widget.userOwnValue) 13 14 15def on_click_a(event): 16 global labelB 17 if labelB is None: 18 # まだlabelBを生成してない場合のみ生成する 19 labelB = tk.Label(root, text="×", font=size) 20 labelB.userOwnValue = 2 21 labelB.place(x=size) 22 labelB.bind("<1>", on_click_b) 23 on_click_common(event) 24 25 26def on_click_b(event): 27 on_click_common(event) 28 29 30labelA = tk.Label(root, text="○", font=size) 31labelA.userOwnValue = 1 32labelA.place(x=0) 33labelA.bind("<1>", on_click_a) 34 35 36tk.mainloop()

投稿2018/05/11 23:22

編集2018/05/12 09:46
KSwordOfHaste

総合スコア18394

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

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

vibrato

2018/05/12 01:40

回答ありがとうございます。 頂いた回答を元に追記させて頂きました。 是非よろしくお願いします。
KSwordOfHaste

2018/05/12 01:48

(3)ですが、本来textとtextvariableは同時に指定するものではなく多分後から指定したtextvariableが有効になっただけだと思います。 (4)はそもそもそれがtextvariableに期待する動作です。 ご質問は最初から「ゴールが何か」を明示するようにしましょう。途中で質問内容をあれこれ変えると閲覧者・質問者・回答者ともに迷走してしまいますよ?あなたが「どういう動作を望んでいる」のかさえ明記してあれば最初から適切なアドバイスができると思うのですが・・・
vibrato

2018/05/12 06:06

おっしゃるとおりです。申し訳ありません… ご指摘の通り希望動作を記載させて頂きました。 それに伴い質問を簡略しました。質問内容はこれ以上変更しませんので 、よろしければ再びご指導の程よろしくおねがい致します。
KSwordOfHaste

2018/05/12 06:23 編集

「○×どちらをクリックしても同じ値を出力させタイ」とありますがやはりわかりません。「その同じ値とはどういう値なのか」の説明がないため何をしたいかがやはりわからないのです。もっと端的に「機能」を表現しましょう。例えば・・・ やりたいこと: (1)最初は〇だけ表示したい。そのラベルにはある値を結び付けておきたい。その値は1である。 (2)〇をクリックしたら×というラベルをあらたに〇の右側に表示させたい。その×というラベルにもある値を結び付けておきたい。その値も1とする。 (1)、(2)ともに「ある値」はラベルの表示内容とは違う「内部的な値」にしたい。〇ラベルには1という値が対応していて、×ラベルにも1という値を対応させておきたい。 (3)〇、×それぞれクリックしたときにそれぞれのラベルに対応した「値=1」を表示したい。 上はあくまで説明のしかたの例です。質問者さんがやりたいことが上のようなことかどうかはわかりませんが、この程度には「何をしたいかが分かるように」書いてあってほしいということです。
vibrato

2018/05/12 06:50

勉強になります。今後そのように説明できる様に努力します。 コードを見て察して頂いたようで感謝します。 KSwordOfHaste様の言って頂いているような動作にしたいと考えてます。
KSwordOfHaste

2018/05/12 07:39

そうなのですか・・・であればその目的でtextvariableオプションは使えません。textvariableオプションはそういう目的で使うものではありません。あくまでラベルの表示文字列を設定するために使うものです。
vibrato

2018/05/12 11:31

サンプルコードまで頂きありがとうございました!! 「.userOwnValue」これで解決しました! >そこまで厳密にすべきかどうか自分にはわかりませんでした。 今のところ厳密性は必要ないと考えておりますので、教えていただいたもので十分です。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問