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

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

ただいまの
回答率

88.04%

Python TkinterでCheckBoxを,プログラム内からチェックする

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 6,428

score 1871

PythonのTkiterを用いて,GUIを作っています.
Tkiterは,あまり有名ではないのか,あまり参考サイトがなく困っています.

CheckBox(TkinterではCheckButton?)を,プログラムから動的にチェックを切り替えたいのですが,その方法がわかりません.

更に,CheckBoxの連動について.
例えば以下のソースだと,正常に動作します.
from Tkinter import *

root = Tk()

opts1 = BooleanVar()
opts1.set(True)
opts2 = BooleanVar()
opts2.set(False)
opts3 = BooleanVar()
opts3.set(True)

Label(text ='Check Button').pack()
Checkbutton(text = 'option 1', variable = opts1).pack()
Checkbutton(text = 'option 2', variable = opts2).pack()
Checkbutton(text = 'option 3', variable = opts3).pack()

root.mainloop()

しかし,以下のように書くと,想定外の動作が起こります.
全てのCheckBoxが連動してしまうのです.
例えば,3番目のCheckBoxをクリックすると,全てのCheckBoxが連動してチェックされたり消えたりします.
これはなぜなのでしょうか?
import Tkinter

root = Tkinter.Tk()

array = ["a","s","d","f","g","h","f","k","l"]

for d in range(len(array)):
        b = Tkinter.Checkbutton(root, text = d, variable = True)
        b.place(x=1,y=20*d)
root.mainloop()

よろしくお願いいたします
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

初回答なので、回答になっていないかも知れませんが参考になれば幸いです。
そもそも余りTkinter使ったことありませんが(苦笑)

チェックボックスをプログラムからON,OFFかえる場合は
「select()」(ON)と「deselect()」(OFF)のメソッドを使います。

もしも、プログラムからチェックボックスのONとOFFを切り替えたいのであれば
この二つのメソッドで実現できると思います。

以下はボタンを押すことでチェックボックスのONとOFFを切り替えます。
#coding: utf-8
import tkinter as t
# メインクラスの作成
class main(t.Tk):
    def __init__(self):
        t.Tk.__init__(self)
        self.object_set()
    # オブジェクトを配置するメソッド
    def object_set(self):
        # チェックボックスの作成
        # self.check はチェックボックスの状態。
        # self.check_object はオブジェクト本体
        self.check=t.BooleanVar()
        self.check.set(True)
        self.check_object=t.Checkbutton( self , text="test" , variable = self.check )
        self.check_object.pack()
        # メソッド change を呼び出すボタンの設置
        t.Button( self , text="Change" , command= self.change ).pack()
    # チェックボックスを変えるメソッド
    def change(self):
        # 状態を取得
        x = self.check.get()
        # 状態がONのとき
        if x == True : self.check_object.deselect() 
        # 状態がOFFのとき
        else : self.check_object.select() 

root = main()
root.mainloop()

ですが、連動の仕組みはわかりませんでした。

variableのオプションに同じ値を選択したもの同士が連動するみたいですね。
Trueや同じ変数を使わなければ連動しないのでリストなどで管理すれば回避できると思いますが
不思議ですね(笑)pythonの参照渡しと関係があるのかなぁ?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/02/17 02:16

    ご回答有難うございます。
    まずはじめに謝罪をば。
    自己解決いたしました。申し訳ありません。

    ただし、自己解決と言っても、最低限必須の機能部分のみの解決です。
    とりあえずやってみたら動いた!程度のことですので、追加で情報をいただけるとありがたいです。


    まず、68and68様のご回答を拝見し、Pythonってこんな書き方もできるんだ……と感動しました。
    私は完全なる、「関数型」の人間でして、オブジェクト指向にどうも慣れません。

    まず、
    >class main(t.Tk):
    これはどういった意味合いになるのでしょうか?
    mainクラスに引数として、t.Tkを渡している……ようなのですが、
    Tkとは?
    >import tkinter as t
    ここで、tkinterのモジュールは「t」として読み込んでいるのではないのでしょうか?

    次に、
    >def __init__(self):
    ……これはなんぞや?
    init関数に……アンダーバー?
    何を示しているのでしょうか?

    すでにこの辺りから若干置いてけぼりを食らってしまっています。
    更に、各関数……この場合はメソッドというのでしょうか?

    メソッドの「self」という引数。
    JAVAなどでチラリと見たことがありますが、「自身」を指す特殊変数のようなものと認識していますが、あっていますでしょうか?


    最後に、自己解決した部分を。
    >ですが、連動の仕組みはわかりませんでした。
    >variableのオプションに同じ値を選択したもの同士が連動するみたいですね。
    そのようです。
    結局variableはTrue or Falseの二択なので、
    BooleanVar()を使えば解決しました。
    この時、
    Array = []
    a = Tkinter.BooleanVar()
    a.set(False)
    (略:チェックボックスの作成)
    Array.append(a)
    このようにしていくと、連動なしでチェックボックスが作成できました。

    キャンセル

  • 2015/02/17 18:21

    まず、クラスとメソッドから説明させていただきます。
    余計でしたら飛ばしてください。

    クラスとはデータや処理をまとめたものです。
    そして、その処理をメソッド(C++とかではメンバ関数)と呼ばれます。

    僕は、クラスという道具箱にメソッドという道具が入ってると考えています。
    机を作るための道具箱には、机を作るためノコギリや定規、ドライバーがある。
    という感じです。

    list も実はクラスで
    list 専用の道具箱に append などの道具が入っているのです。

    さらに Tk() もクラスで .mainloop はメソッドです。


    では本題に入ります。


    >class main(t.Tk):
    引数にクラスを指定することでそのクラスを継承できるのです。
    これで、今から作るクラス main() に Tk() クラスを継承しているのです。

    継承とは、よく言われるのは、クラスの引継ぎです。
    ですが、コピーと考えて僕は問題ないと思っています。

    継承によって Tk() に定義されているの構造やメソッドなどをぜーんぶコピーしちゃうのです。
    これにより Tk() を継承した main() は
    Tk() のメソッドである .mainloop() などをコピー(引継ぎ)して
    main() でも 使えるようになるのです。

    なので Tk().mainloop() も main().mainloop() も同じということです。



    >def __init__(self):
    __init__ などの __ がついているメソッドは特殊メソッドと呼ばれるものです。

    __init__ は、インスタンスが作成されたときに一番最初に実行される
    メソッドをあらわします。これをコンストラクタと呼びます。


    ですが、「インスタンス」で??となると思います。
    インスタンスとは、たとえば

      変数 = 机の道具箱()  ※本当は 変数 = クラス()

    と実行したとき
    変数には机の道具箱で作られた、机が入れられるのです。
    その机がインスタンスです。

    椅子の道具箱であれば、椅子が代入されるし

    list() であれば list() の構造が代入されるということです。

    そして、始めに戻ります。
    __init__はインスタンスが作られたときに一番に実行されるメソッド(処理)なのです。

    その処理では、机にニスを塗ったり、椅子に肘掛をつけたり
    main() では Tk() を実行しチェックボックスやボタンを設置しています。



    >メソッドの「self」という引数。
    はい。自分自身で問題ありません。

    しいて言うなら
    pythonでは特殊な変数というわけではありません。タダの変数です。
    ですが、python ではわかりやすく self にしましょうといった暗黙の了解があるのです。

    メソッドを定義する際の第一引数にインスタンスが渡されます。
    それを、わかりやすくあらわしているのです。



    ちなみに

      root.mainloop()

    の root がインスタンスを持つ変数なので
    メソッドを定義する際の第一引数にはこの root が入ることになります。

    なので、説明とかでは

      self.メソッド名()

    と表記されることがあるんです。

    キャンセル

  • 2015/02/18 03:39

    ぐおおお!!
    わかりやすい回答有難うございます!
    なんとなく理解できたような気がします。
    このままJavaを勉強しようかなー……

    それにしても、initがコンストラクタとは……
    ということはデストラクタもあるのかなーと思ってみたり。

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

    キャンセル

-1

まとめておきました
http://qiita.com/nnahito/items/41be8e02a6ebc91386e7

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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