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

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

ただいまの
回答率

87.37%

[Python3] tkinter, ラジオボタンとチェックボックスの初期値を設定したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,855

score 23

python3でtkinterを使用し、ラジオボタンとチェックボックスの組み合わせを作成しました。

デフォルトの状態で
フレームAとBは選択不可能な状態、
選択フレームでAかBを選ぶと、選択した側のチェックボックスが使えるような状態にしたいです。

検索しても上手く条件にあてはまるようなものが見つけられませんでした。
どなたかご教授願えませんでしょうか。

当方初心者のため非常に見づらいコードですが、よろしくお願いします。Python 3.x コード

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('設定')
root.geometry("500x500+640+40")

Frame

frame1 = ttk.Frame(root,padding=10)
frame1.grid()

Label Frame

lf = ttk.Labelframe(frame1, text='選択',padding=5)
lf.grid(row=0,column=0,pady=5)

Radiobutton 1

rb1 = ttk.Radiobutton(lf, text='A ')
rb1.grid(row=1,column=0,pady=5)

Radiobutton 2

rb2 = ttk.Radiobutton(lf, text='B')
rb2.grid(row=1,column=1,pady=5)

Frame 2

frame2 = ttk.Frame(root,padding=10)
frame2.place(x=0, y=80)

Label Frame 2

lf2 = ttk.Labelframe(frame2, text='A',padding=5)
lf2.grid(row=4,column=0,pady=5)

Button 1

btn1 = ttk.Button(lf2, text='全選択', padding=5)
btn1.grid(row=5,column=0,pady=5)

Button 2

btn2 = ttk.Button(lf2, text='全解除', padding=5)
btn2.grid(row=5,column=1,pady=5)

A

ch1 = ttk.Checkbutton(lf2, text='CH1')
ch1.grid(row=6,column=0,pady=5)

ch2 = ttk.Checkbutton(lf2, text='CH2')
ch2.grid(row=7,column=0,pady=5)

ch3 = ttk.Checkbutton(lf2, text='CH3')
ch3.grid(row=8,column=0,pady=5)

Frame 3

frame3 = ttk.Frame(root,padding=10)
frame3.place(x=230, y=80)

Label Frame 3

lf3 = ttk.Labelframe(frame3, text='B',padding=5)
lf3.grid(row=4,column=0,pady=5)

Button 3

btn3 = ttk.Button(lf3, text='全選択', padding=5)
btn3.grid(row=5,column=0,pady=5)

Button 4

btn4 = ttk.Button(lf3, text='全解除', padding=5)
btn4.grid(row=5,column=1,pady=5)

B

ch36 = ttk.Checkbutton(lf3, text='ch36')
ch36.grid(row=6,column=0,pady=5)

ch40 = ttk.Checkbutton(lf3, text='ch40')
ch40.grid(row=7,column=0,pady=5)

ch44 = ttk.Checkbutton(lf3, text='ch44')
ch44.grid(row=8,column=0,pady=5)

root.mainloop()

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

はじめにRadiobuttonの初期値を制御方法です。

Radiobuttonにて何が選択されているかを格納する変数を

# 選択されたFrameを格納する変数 (0:A, 1:B)
selected_frame = IntVar()


のように定義し、各Radiobutton

#Radiobutton 1(選択された場合 selected_frame の値は0)
rb1 = ttk.Radiobutton(frame1, text='A', variable=selected_frame, value=0)
#Radiobutton 2(選択された場合 selected_frame の値は1)
rb2 = ttk.Radiobutton(frame1, text='B', variable=selected_frame, value=1)


のように選択されたときの値を定義してください。
あとは

# 初期値を設定 (Aを選択)
selected_frame.set(0)


のように変数に値を入れることで初期状態を設定することができるかと思います。

次に Radiobutton の状態によって選択した側のチェックボックスが使えるように(選択されていない側を使えないように)する方法です。

これは

rb1 = ttk.Radiobutton(frame1, text='A', variable=selected_frame, value=0, command=change_selected_frame)

のように、Radiobutton の commandパラメータにて、Radiobuttonが押されたと
きに呼び出される関数を設定します。

あとは、この関数の中で、

def change_selected_frame():
    # Aが選択されてる
    if selected_frame.get() == 0:
        ch1.configure(state='enable')
        ch2.configure(state='enable')
        ch3.configure(state='enable')
        ch36.configure(state='disable')
        ch40.configure(state='disable')
        ch44.configure(state='disable')
    # Bが選択されてる
    elif selected_frame.get() == 1:
        ch1.configure(state='disable')
        ch2.configure(state='disable')
        ch3.configure(state='disable')
        ch36.configure(state='enable')
        ch40.configure(state='enable')
        ch44.configure(state='enable')
    # 選択されていない
    else:
        ch1.configure(state='disable')
        ch2.configure(state='disable')
        ch3.configure(state='disable')
        ch36.configure(state='disable')
        ch40.configure(state='disable')
        ch44.configure(state='disable')

のように Checkbutton を有効・無効を切り替えてことによって、希望する動作を作成することができるかと思います。

以上、以下に動作するコードを書いておきますので参考にしてください

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('設定')
root.geometry("500x500+640+40")

# Frame1
frame1 = ttk.Labelframe(root, text='選択', padding=5)
frame1.grid(row=0,column=0)

# Frame 2
frame2 = ttk.Labelframe(root, text='A',padding=5)
frame2.grid(row=1,column=0)

# Frame 3
frame3 = ttk.Labelframe(root, text='B',padding=5)
frame3.grid(row=1,column=1)

# 選択されたFrameを格納する変数 (0:A, 1:B)
selected_frame = IntVar()

def change_selected_frame():
    # Aが選択されてる
    if selected_frame.get() == 0:
        # Frame2内のWidgetを全てEnable
        for child in frame2.winfo_children():
            child.configure(state='enable')
        # Frame3内のWidgetを全てDisable
        for child in frame3.winfo_children():
            child.configure(state='disable')
    # Bが選択されてる
    elif selected_frame.get() == 1:
        # Frame2内のWidgetを全てDisable
        for child in frame2.winfo_children():
            child.configure(state='disable')
        # Frame3内のWidgetを全てEnable
        for child in frame3.winfo_children():
            child.configure(state='enable')
    # 選択されていない
    else:
        # Frame2/3内のWidgetを全てDisable
        for child in frame2.winfo_children():
            child.configure(state='disable')
        for child in frame3.winfo_children():
            child.configure(state='disable')

#Radiobutton 1(選択された場合 selected_frame の値は0)
rb1 = ttk.Radiobutton(frame1, text='A',
                      variable=selected_frame,
                      value=0,
                      command=change_selected_frame)
rb1.grid(row=1,column=0,pady=5)

#Radiobutton 2(選択された場合 selected_frame の値は1)
rb2 = ttk.Radiobutton(frame1,
                      text='B',
                      variable=selected_frame,
                      value=1,
                      command=change_selected_frame)
rb2.grid(row=1,column=1,pady=5)

#Button 1
btn1 = ttk.Button(frame2, text='全選択', padding=5)
btn1.grid(row=5,column=0,pady=5)

#Button 2
btn2 = ttk.Button(frame2, text='全解除', padding=5)
btn2.grid(row=5,column=1,pady=5)

#A
ch1 = ttk.Checkbutton(frame2, text='CH1')
ch1.grid(row=6,column=0,pady=5)

ch2 = ttk.Checkbutton(frame2, text='CH2')
ch2.grid(row=7,column=0,pady=5)

ch3 = ttk.Checkbutton(frame2, text='CH3')
ch3.grid(row=8,column=0,pady=5)

#Button 3
btn3 = ttk.Button(frame3, text='全選択', padding=5)
btn3.grid(row=5,column=0,pady=5)

#Button 4
btn4 = ttk.Button(frame3, text='全解除', padding=5)
btn4.grid(row=5,column=1,pady=5)

#B
ch36 = ttk.Checkbutton(frame3, text='ch36')
ch36.grid(row=6,column=0,pady=5)

ch40 = ttk.Checkbutton(frame3, text='ch40')
ch40.grid(row=7,column=0,pady=5)

ch44 = ttk.Checkbutton(frame3, text='ch44')
ch44.grid(row=8,column=0,pady=5)

# 初期値を設定
selected_frame.set(-1) # 0,1 以外の値を設定する
change_selected_frame() # Frameの状態を初期状態に合わせる

root.mainloop()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/18 08:39

    magichanさん、どうもありがとうございました!!
    意図していた通りの動きです。
    本当に助かりました。
    変数の使い方ですか。これを参考に色々触ってみようと思います。

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

    キャンセル

0

tkinter checkbutton 初期値
でググりました。

以下のページが参考になりませんか?

https://qiita.com/nnahito/items/ad1428a30738b3d93762

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/17 17:09

    はい、このサイトは拝見しましたが私の知識ではBooleanVar()を上手く落とし込めないので質問させていただいております。

    キャンセル

  • 2019/09/17 18:44

    であれば、その旨質問に記載すれば良さそうに思いますが。。
    上手く落とし込めないの意味がわかりませんが、何ができないのでしょう。

    キャンセル

  • 2019/09/18 08:36

    いえ、冷やかしのような性格の悪い人間を相手にする暇はござません。
    そのような人間に説明する気もおきません。申し訳ございません。

    キャンセル

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

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

関連した質問

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