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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Tkinter

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

Python

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

Q&A

解決済

2回答

9456閲覧

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

nnahito

総合スコア2004

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Tkinter

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

Python

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

0グッド

1クリップ

投稿2015/02/16 04:25

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

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

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

lang

1from Tkinter import * 2 3root = Tk() 4 5opts1 = BooleanVar() 6opts1.set(True) 7opts2 = BooleanVar() 8opts2.set(False) 9opts3 = BooleanVar() 10opts3.set(True) 11 12Label(text ='Check Button').pack() 13Checkbutton(text = 'option 1', variable = opts1).pack() 14Checkbutton(text = 'option 2', variable = opts2).pack() 15Checkbutton(text = 'option 3', variable = opts3).pack() 16 17root.mainloop() 18

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

lang

1import Tkinter 2 3root = Tkinter.Tk() 4 5array = ["a","s","d","f","g","h","f","k","l"] 6 7for d in range(len(array)): 8 b = Tkinter.Checkbutton(root, text = d, variable = True) 9 b.place(x=1,y=20*d) 10root.mainloop() 11

よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

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

以下はボタンを押すことでチェックボックスのONとOFFを切り替えます。

lang

1#coding: utf-8 2import tkinter as t 3# メインクラスの作成 4class main(t.Tk): 5 def __init__(self): 6 t.Tk.__init__(self) 7 self.object_set() 8 # オブジェクトを配置するメソッド 9 def object_set(self): 10 # チェックボックスの作成 11 # self.check はチェックボックスの状態。 12 # self.check_object はオブジェクト本体 13 self.check=t.BooleanVar() 14 self.check.set(True) 15 self.check_object=t.Checkbutton( self , text="test" , variable = self.check ) 16 self.check_object.pack() 17 # メソッド change を呼び出すボタンの設置 18 t.Button( self , text="Change" , command= self.change ).pack() 19 # チェックボックスを変えるメソッド 20 def change(self): 21 # 状態を取得 22 x = self.check.get() 23 # 状態がONのとき 24 if x == True : self.check_object.deselect() 25 # 状態がOFFのとき 26 else : self.check_object.select() 27 28root = main() 29root.mainloop()

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

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

投稿2015/02/16 10:10

編集2015/02/16 11:16
68and68

総合スコア11

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

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

nnahito

2015/02/16 17: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) このようにしていくと、連動なしでチェックボックスが作成できました。
68and68

2015/02/17 09: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.メソッド名() と表記されることがあるんです。
nnahito

2015/02/17 18:39

ぐおおお!! わかりやすい回答有難うございます! なんとなく理解できたような気がします。 このままJavaを勉強しようかなー…… それにしても、initがコンストラクタとは…… ということはデストラクタもあるのかなーと思ってみたり。 本当にありがとうございました!
guest

0

投稿2015/02/28 05:49

nnahito

総合スコア2004

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問