🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

button

HTMLで用いる<button>タグです。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Python

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

Q&A

解決済

1回答

2559閲覧

tkinter radio button の質問

skysoul

総合スコア111

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

button

HTMLで用いる<button>タグです。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Python

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

0グッド

0クリップ

投稿2020/06/14 10:46

編集2020/06/15 07:08

質問

下記、「問題のコード」でラジオボタンが2個同時についてしまいます。
最初から2個ついているのではなく、ONのほうにマウスをかざすと(押すのではなく)選択されてしまいます。
変数はしっかり作ってあるはずです。
問題のコード

python

1 root = tkinter.Tk() 2 root.geometry("300x150") 3 4 # Canvas Widget を生成 5 canvas = tkinter.Canvas(root) 6 7 # Top Widget上に Scrollbar を生成して配置 8 bar = tkinter.Scrollbar(root, orient=tkinter.VERTICAL) 9 bar.pack(side=tkinter.RIGHT, fill=tkinter.Y) 10 bar.config(command=canvas.yview) # ScrollbarでCanvasを制御 11 12 # Canvas Widget をTopWidget上に配置 13 canvas.config(yscrollcommand=bar.set) # Canvasのサイズ変更をScrollbarに通知 14 canvas.config(scrollregion=(0,0,300,150)) #スクロール範囲 15 canvas.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True) 16 17 # Frame Widgetを 生成 18 frame = tkinter.Frame(canvas) 19 20 # Frame Widgetを Canvas Widget上に配置() 21 canvas.create_window((0,0), window=frame, anchor=tkinter.NW, width=500, height=500) 22 23 # ラジオボタン判定変数作成 24 settei_button = tkinter.IntVar() 25 settei_button.set(auto_up) 26 27 # auto up 案内 28 auto_up_ravel = tkinter.Label(canvas,text='PCを立ち上げたときと同時にこのアプリも起動する') 29 auto_up_ravel.place(x=25, y=25) 30 31 # ONOFFラジオボタン 32 auto_on = tkinter.Radiobutton(canvas, value=0, variable=settei_button, text='ON') 33 auto_on.place(x=25, y=55) 34 auto_off = tkinter.Radiobutton(canvas, value=1, variable=settei_button, text='OFF') 35 auto_off.place(x=25, y=85) 36 37 # 確定ボタン 38 btn_kakutei = tkinter.Button(canvas, text='確定', command=btn_kakutei_click) 39 btn_kakutei.place(x=100, y=115) 40 41 root.mainloop()

試したこと

変数のスペルミスの確認
半角スペースの挿入(変数名の前に)


イメージ説明

フルコード

https://skysoulinc.web.fc2.com/text_kyouyuu/todo_mondaiten.html

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

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

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

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

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

teamikl

2020/06/14 11:27

コードが実行できません。未定義の変数・関数がいくつかあるようです
teamikl

2020/06/14 11:35 編集

修正して実行してみましたが、上記のコードで問題の現象は確認できませんでした。 現象自体は心当たりがありますが、以前と同じ問題ではないですか? なぜかラジオボタンのセット実行しても違うところに印が入る https://teratail.com/questions/264905 TkInter ラジオボタンのグループ単位での、単一選択制御ができない。 https://teratail.com/questions/267783 ↑マウスオーバーだけで選択されてしまう症状。同じ原因だと思いますが、 掲載のコードには該当しそうな箇所はありません。
guest

回答1

0

ベストアンサー

win10/python3.8.3 です、問題の現象は確認できませんでした。
掲載のコード以外にコードはありませんか?
気になる部分は、以前の質問のコードで Tk() のインスタンスを複数作っていた辺り。

イメージ説明

以下のコードで問題が発生するか試して下さい。
質問のコードの未定義箇所を補っただけのコードです。

python

1import tkinter 2 3auto_up = True # False 4 5if __name__ == '__main__': 6 root = tkinter.Tk() 7 root.geometry("300x150") 8 9 # Canvas Widget を生成 10 canvas = tkinter.Canvas(root) 11 12 # Top Widget上に Scrollbar を生成して配置 13 bar = tkinter.Scrollbar(root, orient=tkinter.VERTICAL) 14 bar.pack(side=tkinter.RIGHT, fill=tkinter.Y) 15 bar.config(command=canvas.yview) # ScrollbarでCanvasを制御 16 17 # Canvas Widget をTopWidget上に配置 18 canvas.config(yscrollcommand=bar.set) # Canvasのサイズ変更をScrollbarに通知 19 canvas.config(scrollregion=(0,0,300,150)) #スクロール範囲 20 canvas.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True) 21 22 # Frame Widgetを 生成 23 frame = tkinter.Frame(canvas) 24 25 # Frame Widgetを Canvas Widget上に配置() 26 canvas.create_window((0,0), window=frame, anchor=tkinter.NW, width=500, height=500) 27 28 # ラジオボタン判定変数作成 29 settei_button = tkinter.IntVar() 30 settei_button.set(auto_up) 31 32 # auto up 案内 33 auto_up_ravel = tkinter.Label(canvas,text='PCを立ち上げたときと同時にこのアプリも起動する') 34 auto_up_ravel.place(x=25, y=25) 35 36 # ONOFFラジオボタン 37 auto_on = tkinter.Radiobutton(canvas, value=0, variable=settei_button, text='ON') 38 auto_on.place(x=25, y=55) 39 auto_off = tkinter.Radiobutton(canvas, value=1, variable=settei_button, text='OFF') 40 auto_off.place(x=25, y=85) 41 42 # 確定ボタン 43 btn_kakutei = tkinter.Button(canvas, text='確定') #, command=btn_kakutei_click) 44 btn_kakutei.place(x=100, y=115) 45 46 root.mainloop()

関連

投稿2020/06/14 11:42

teamikl

総合スコア8722

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

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

skysoul

2020/06/15 07:05

tkinter.Tk()って複数使ってはいけないということですか?
teamikl

2020/06/15 08:26

tkinter.Tk 内部では、ライブラリであるtcl/tk環境へコマンドを送る為のオブジェクトで 通常はプロセス内で一つのみ作成します。(関数を抜けて破棄された時に外のTkオブジェクトに影響します) 便宜上、tkinter.Tkもウィンドウを持ちますがこれをダイアログとして使うのは誤りで 新規ウィンドウが必要な場合は、tkinter.Toplevelを使います。
teamikl

2020/06/15 08:57 編集

フルコードで現象確認できました。 簡単な対処法: 一番最初の tkinter.Tk() 以外は、tkinter.Toplevel を使うようにしてみて下さい。 (名称変更のみで済むはずです) 改善案: ダイアログ・クラスがあるので、それを拡張して作ると良いです。 tkinter.simpledialog, commondialogあたりを参考に。
teamikl

2020/06/15 09:00 編集

本題とは少し外れる部分ですが、 ラジオボタンの変数 settei_button = tkinter.IntVar() は、 グローバル宣言ではなく、普通にグローバルで作成したほうが良さそうです。 設定ダイアログを開くたびに毎回作るのでは、 他の箇所で以前の参照が残っていた場合に誤動作の原因になります。 (現状は問題なしですが、コード変更により問題になる可能性がある)
skysoul

2020/06/15 10:04

できました!ありがとうございます
teamikl

2020/06/15 22:54

余談ですが、気づいた点 Label, Radiobutton, Button の親(第一引数)は canvas ではなくて、frameでは? 必要ないかも知れないけど、スクロールの対象から外れてるみたいですよ。 スクロール範囲もキャンバスサイズと合ってないようです。
skysoul

2020/06/16 08:32

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問