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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Tkinter

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

Q&A

解決済

1回答

5466閲覧

tkinter Radiobuttonでコンボボックスのstateを変更したい

tk527

総合スコア13

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/01/27 18:34

tkinter Radiobuttonでコンボボックスのstateを変更したい

python初心者です。pythonのtkinterでGUIを作成しています。
2つのラジオボタンのうち片方を選択すると2つあるコンボボックスの一方が使えるようになり、もう一方は使えず、
もう一方のラジオボタンを選択すると先程使えた方が使えなくなり、使えなかった方が使えるようにしたいです。

いろいろな記事の方法を試してみましたが、私はclassを使っているせいか、うまく動作しませんでした。

ラジオボタンの選択が変わった時点でstateを変更したいので、commandで関数を実行する方法を考えました。

該当のソースコード

python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4class tkinter(tk.Frame): 5 def __init__(self,master): 6 val = tk.IntVar() 7 val.set(0) 8 label = tk.LabelFrame(self).pack() 9 rdo1 = tk.Radiobutton(label,text = "radiobutton1",variable = val,value = 0,command = lambda : (A,B) = self.funt1(val.get())) 10 rdo1.grid(row = 0,column = 0) 11 rdo2 = tk.Radiobutton(label,text = "radiobutton2",variable = val,value = 1,command = lambda : (A,B) = self.func1(val.get())) 12 rdo2.grid(row = 1,column = 0) 13 cmb1 = ttk.Combobox(label,state = A).grid(row = 0,column = 1) 14 cmd1["values"] = ["0","1","2"] 15 cmb2 = ttk.Combobox(label,state = B).grif(row = 1,column = 1) 16 cmd2["values"] = ["3","4","5"] 17 18 def func1(self,val): 19 if val == 0: 20 A = 'readonly' 21 B = 'disabled' 22 elif val == 1: 23 A = 'disabled' 24 B = 'readonly' 25 return A,B 26 27if __name__ == '__main__': 28 b = tkinter() 29 b.pack() 30 b.mainloop()

SyntaxErrorがでてきているので、そもそもラジオボタンのコマンドで戻り値を含む関数を実行すること自体不可能なのでしょうか?

お手数をおかけしますが、ご回答よろしくお願いします。

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

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

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

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

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

hayataka2049

2019/01/27 22:39

lambdaの中では代入は書けません。それはともかく動作する状態のコードを貼っていただけると助言しやすいです。
guest

回答1

0

ベストアンサー

とりあえず動作するように修正してみました。
構成は大きく修正しておりませんのでコードを見ていただくと理解できるかと思いますが、

主な修正点は

  • val, cmb1, cmb2 をインスタンス変数とした
  • func1メソッドでの処理にて直接 cmb1,cmb2の状態をを変更するように修正した

となります。

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4class tkinter(tk.Frame): 5 def __init__(self, master=None): 6 tk.Frame.__init__(self, master) 7 label = tk.LabelFrame(self).pack() 8 self.val = tk.IntVar() 9 self.val.set(0) 10 rdo1 = tk.Radiobutton(label, text = "radiobutton1", variable = self.val,value = 0, command = self.func1) 11 rdo1.grid(row=0,column=0) 12 rdo2 = tk.Radiobutton(label, text = "radiobutton2", variable = self.val, value = 1, command = self.func1) 13 rdo2.grid(row = 1,column = 0) 14 self.cmb1 = ttk.Combobox(label,state = 'readonly') 15 self.cmb1.grid(row = 0,column = 1) 16 self.cmb1["values"] = ["0","1","2"] 17 self.cmb2 = ttk.Combobox(label,state = 'disable') 18 self.cmb2.grid(row = 1,column = 1) 19 self.cmb2["values"] = ["3","4","5"] 20 21 22 def func1(self): 23 if self.val.get() == 0: 24 self.cmb1['state'] = 'readonly' 25 self.cmb2['state'] = 'disable' 26 if self.val.get() == 1: 27 self.cmb1['state'] = 'disable' 28 self.cmb2['state'] = 'readonly' 29 30if __name__ == '__main__': 31 b = tkinter() 32 b.grid() 33 b.mainloop()

投稿2019/01/28 01:12

magichan

総合スコア15898

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

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

tk527

2019/01/28 05:37

ご回答ありがとうございます! ご回答くださったコードを参考に書き直したところ無事目的の動作を実現することができました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問