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

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

ただいまの
回答率

90.47%

  • Python

    8565questions

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

python tkinter Labelについて質問です

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 484

vibrato

score 20

 希望動作

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

size = 40
def Callback(event):
    labelB = tk.Label(root, text="×", textvariable=1, font=size)
    labelB.place(x=size)
    labelB.bind("<1>",Callback)
    value = int(str(event.widget["textvariable"]))
    print(value)

labelA = tk.Label(root, text="○", textvariable=1, font=size)
labelA.place(x=0)
labelA.bind("<1>",Callback)

tk.mainloop()


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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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と絶対に衝突しない名前を定義すると安全とは思いますがそこまで厳密にすべきかどうか自分にはわかりませんでした。

import tkinter as tk


root = tk.Tk()
size = 40

labelB = None


def on_click_common(event):
    print('text of clicked label     =', event.widget['text'])
    print('userOwnValue of the label =', event.widget.userOwnValue)


def on_click_a(event):
    global labelB
    if labelB is None:
        # まだlabelBを生成してない場合のみ生成する
        labelB = tk.Label(root, text="×", font=size)
        labelB.userOwnValue = 2
        labelB.place(x=size)
        labelB.bind("<1>", on_click_b)
    on_click_common(event)


def on_click_b(event):
    on_click_common(event)


labelA = tk.Label(root, text="○", font=size)
labelA.userOwnValue = 1
labelA.place(x=0)
labelA.bind("<1>", on_click_a)


tk.mainloop()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/12 10:40

    回答ありがとうございます。
    頂いた回答を元に追記させて頂きました。

    是非よろしくお願いします。

    キャンセル

  • 2018/05/12 10:48

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

    キャンセル

  • 2018/05/12 15:06

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

    キャンセル

  • 2018/05/12 15:23 編集

    「○×どちらをクリックしても同じ値を出力させタイ」とありますがやはりわかりません。「その同じ値とはどういう値なのか」の説明がないため何をしたいかがやはりわからないのです。もっと端的に「機能」を表現しましょう。例えば・・・

    やりたいこと:
    (1)最初は〇だけ表示したい。そのラベルにはある値を結び付けておきたい。その値は1である。
    (2)〇をクリックしたら×というラベルをあらたに〇の右側に表示させたい。その×というラベルにもある値を結び付けておきたい。その値も1とする。
    (1)、(2)ともに「ある値」はラベルの表示内容とは違う「内部的な値」にしたい。〇ラベルには1という値が対応していて、×ラベルにも1という値を対応させておきたい。
    (3)〇、×それぞれクリックしたときにそれぞれのラベルに対応した「値=1」を表示したい。

    上はあくまで説明のしかたの例です。質問者さんがやりたいことが上のようなことかどうかはわかりませんが、この程度には「何をしたいかが分かるように」書いてあってほしいということです。

    キャンセル

  • 2018/05/12 15:50

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

    キャンセル

  • 2018/05/12 16:39

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

    キャンセル

  • 2018/05/12 20:31

    サンプルコードまで頂きありがとうございました!!
    「.userOwnValue」これで解決しました!

    >そこまで厳密にすべきかどうか自分にはわかりませんでした。
    今のところ厳密性は必要ないと考えておりますので、教えていただいたもので十分です。

    ありがとうございました!!

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    プログラムがうまく動かない

    お世話になります。少しづつ勉強していますが下記の意味が良く理解できません。なぜエラーが返りカウント表示がされないのでしょうか?0から進まないのはなぜですか?

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    バインドの解除

    前提・実現したいこと Python・Tkinterで簡単なアプリケーションを作成していて、下記の様なコードを書きました。特にエラー等はないのですが、一度root.bind('<R

  • 解決済

    Pythonのbuttonの表示結果をターミナルではなくフレームに

    from tkinter import * from tkinter import ttk def button_click(): show_selection() d

  • 解決済

    2回目のボタン押下時に1回目の結果を削除したい

    前提・実現したいこと 「名簿」と「お題」という二つのcsvを読み込み、 そこから3つの氏名とお題をそれぞれ重複なしでランダムに抽出し、 「Aが語るx」 「Bが語るy」 「Cが語るz

  • 解決済

    Python3 ウインドウについて

    ](12000f9fc955244503fcd1223e8d965e.jpeg)### 前提・実現したいこと pythonを使って、おみくじのプログラムを作っています。 tki

  • 解決済

    Tkinter Buttonのbackgroundの色を動的に変更する方法

     前提・実現したいこと TkinterでUIを作成しているのですが、ボタンを押した際にボタンの背景色を変更したいと考えています。 以下のようなforで回してボタンを10x10個敷き

  • 受付中

    python tkinterでフレームの中でスクロール?させたい

    pythonのtkinterを使ってフレーム内でのスクロール?を可能にしたいです。 root = Tk.Tk() root.title("tkinter") root.geom

同じタグがついた質問を見る

  • Python

    8565questions

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