width Radiobutton

あん
Radiobutton
Radiobuttonとは
昔のカーラジオは複数の選曲ボタンで放送局を選びました。もうお目にかかることはないですね。複数ののボタンで有効となる放送局は1つです。2つ以上選曲出来たら 厄介ですね。

それぞれのラジオボタンと実行ボタンのコールバック関数を用意してあります。チェックボタンと同様にラジオボタンの数が増えてもコードが増えることがないように対応しています。

# -*- coding: utf-8 -*-
import tkinter  as tk
from tkinter import getboolean, messagebox


#ボタンをクリックしたときのイベントハンドラー
def exec_click(btnName):
    chk = 'checked'
    print(btnName + '---' + chk)
    # messagebox.showinfo("発生したイベント",btnName + '---' + chk)

def btn_on(rb):
    print(rb)

def setCommand(radio, title):
    radio.configure(command=lambda:exec_click(title))
 

def main():
    root = tk.Tk()
    root.title("Button's app")
    root.geometry("300x200")

    rbTiles =[
        'Java',
        'Python',
        'C++',
        'VB',
    ]
    radio_frame = tk.LabelFrame(
        root,
        text='Options')
    radio_frame.grid(row = 0, column = 0)

    radioButtons = {}
    selected = tk.IntVar()
    
    cbSize = len(rbTiles)
    for i in range(cbSize):
        radioButtons[i] = tk.Radiobutton(radio_frame,
            text= rbTiles[i],
            value=i,
            anchor='w', 
            # justify='left',
            width = 20,
            variable= selected)
        setCommand(radioButtons[i], rbTiles[i])
        radioButtons[i].grid(row = i,column = 0)
        

    button = tk.Button(
        root,
        bg='pink',
        text='実行',
        activebackground= 'pink',
        command=lambda:btn_on(selected.get()))
    button.grid(row = cbSize, column = 0)

    root.mainloop()

if __name__ == "__main__":
    main()
キモとなるのを以下に記述します。
radio_frame = tk.LabelFrame
ラジオボタンを設置するフレームを用意します。
radioButtons[i] = tk.Radiobutton(radio_frame
ラジオボタンを構築する親ウィンドーはradio_frameになります。
value=i
ここが曲者。整数値を代入しています。これは文字列でもOKです。しかし、最初文字列にしたら初期画面でラジオボタンが全部チェックされていた。それで整数にしたらまともになりました。
variable= selected
selectedはvalueでセットした型と同じにします。違うとエラーになるので注意してください。
selected = tk.IntVar()
何もしないとラジオボタンの配置は中央になっています。justifyで変更できると思ったのですがダメです。
anchor='w'
で左詰めになりました。