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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1066閲覧

選択しているそれぞれのチェックボックスから値を得る

kumamon092

総合スコア1

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2021/01/26 04:29

前提・実現したいこと

チェックボックスの作成はできたのですが、チェックボックスを選択している場合には「1」、選択していない場合には「0」を得て、その情報を配列として出力したいのですが、やり方が分からないので質問しました。できれば下記のソースコードにつけて頂けると幸いです。

発生している問題・エラーメッセージ

それぞれのチェックボックスから値を得ることができない。

エラーメッセージ なし ### 該当のソースコード python3.x # -*- coding: utf-8 -*- import tkinter as tk import PIL.Image, PIL.ImageTk import tkinter as tk import csv result =[] with open("新問診票.csv",encoding="utf-8") as f: for row in csv.reader(f): result.append(row) # = f"{row}" #print(result) class App(tk.Tk): # 呪文 def __init__(self, *args, **kwargs): # 呪文 tk.Tk.__init__(self, *args, **kwargs) # ウィンドウタイトルを決定 self.title("臓腑状態推定システム") # ウィンドウの大きさを決定 self.geometry("1000x1000") # ウィンドウのグリッドを 1x1 にする # この処理をコメントアウトすると配置がズレる self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) #-----------------------------------main_frame----------------------------- # メインページフレーム作成 self.main_frame = tk.Frame() self.main_frame.grid(row=0, column=0, sticky="nsew") # タイトルラベル作成 self.titleLabel = tk.Label(self.main_frame, text="臓腑状態推定システム", font=('Helvetica', '35')) self.titleLabel.pack(anchor='center') # フレーム1に移動するボタン self.changePageButton = tk.Button(self.main_frame, text="開始する", command=lambda : self.changePage(self.frame1)) self.changePageButton.pack() #-------------------------------------------------------------------------- #-----------------------------------frame1--------------------------------- # 移動先フレーム作成 self.frame1 = tk.Frame() self.frame1.grid(row=0, column=0, sticky="nsew") # タイトルラベル作成 self.titleLabel = tk.Label(self.frame1, text="該当する問診を選んでください", font=('Helvetica', '20')) self.titleLabel.pack(anchor='center') #チェックボックスの作成 bln = tk.BooleanVar() bln.set(True) # チェックボタン作成・貼り付け for num in range(117): chk = tk.Checkbutton(self.frame1, variable=bln, text=result[num+1][0]+result[num+1][1]) bln = tk.BooleanVar() if num<30: chk.place(x=0,y=100+20*num) bln.get() elif num>29 and num<=59: chk.place(x=210,y=100+20*(num-30)) bln.get() elif num>58 and num<=89: chk.place(x=410,y=100+20*(num-60)) bln.get() else: chk.place(x=610,y=100+20*(num-90)) bln.get() # フレーム1からmainフレームに戻るボタン self.back_button = tk.Button(self.frame1, text="次へ", command=lambda : self.changePage(self.frame2)) self.back_button.pack() print(bln.get()) #-----------------------------------frame last--------------------------------- # 移動先フレーム作成 self.frame2 = tk.Frame() self.frame2.grid(row=0, column=0, sticky="nsew") # タイトルラベル作成 self.titleLabel = tk.Label(self.frame2, text="結果を出力します", font=('Helvetica', '20')) self.titleLabel.pack(anchor='center') p=0.24 q=0.15 r=0,11 s=1.0 t=0.3 u=0.25 v=0.25 w=0.86 x=0.56 y=0.65 text = tk.Label(self.frame2, text="肝臓+は"+str(p)) text.pack() text1 = tk.Label(self.frame2, text="肝臓-は"+str(q)) text1.pack() text2 = tk.Label(self.frame2, text="心臓+は"+str(r)) text2.pack() text3 = tk.Label(self.frame2, text="心臓-は"+str(s)) text3.pack() text4 = tk.Label(self.frame2, text="脾臓+は"+str(t)) text4.pack() text5= tk.Label(self.frame2, text="脾臓-は"+str(u)) text5.pack() text6 = tk.Label(self.frame2, text="肺+は"+str(v)) text6.pack() text7 = tk.Label(self.frame2, text="肺-は"+str(w)) text7.pack() text8 = tk.Label(self.frame2, text="腎臓+は"+str(x)) text8.pack() text9 = tk.Label(self.frame2, text="腎臓-は"+str(y)) text9.pack() #-------------------------------------------------------------------------- #main_frameを一番上に表示 self.main_frame.tkraise() def changePage(self, page): ''' 画面遷移用の関数 ''' page.tkraise() if __name__ == "__main__": app = App() app.mainloop() ソースコード

試したこと

for文を使い値を得ようとしましたが、できませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

いろいろありますけど。

python

1 for num in range(117): 2 chk = tk.Checkbutton(self.frame1, variable=bln, text=result[num+1][0]+result[num+1][1]) 3 bln = tk.BooleanVar()
  • ここでチェックボタンとその状態を保持するblnを作っていますが、作りっぱなしで作ったものが保存されていないので、後から参照できません。配列を用意してそこに保存しておくなどするのがいいと思います。チェックボックスの方は現状使いみちがなさそうですが、操作をすることになったら使えます。
  • variableにblnを設定していますが、そのblnは後で作っていますね。それではだめです。 前に作って、さらに、bln.set(False)などのように値を設定しましょう。

配列に作成したblnがすべて保存されていれば、その中身をget()で取り出してみれば、状態がわかります。


ざっと書いてみますけど、値を参照するところは自分で書きましょう。
self.checkbox_listにチェックボックスのリストが入ります。
elf.check_statusにチェックの状態が入ります。ここに入っているのは、tk.BooleanVarのオブジェクトなので、get()すると値が得られます。

python

1 self.checkbox_list = [] 2 self.check_states = [] 3 for num in range(117): 4 bln = tk.BooleanVar() 5 bln.set(False) 6 chk = tk.Checkbutton(self.frame1, variable=bln, text=result[num+1][0]+result[num+1][1]) 7 8 if num<30: 9 chk.place(x=0,y=100+20*num) 10 elif num>29 and num<=59: 11 chk.place(x=210,y=100+20*(num-30)) 12 elif num>58 and num<=89: 13 chk.place(x=410,y=100+20*(num-60)) 14 else: 15 chk.place(x=610,y=100+20*(num-90)) 16 17 self.checkbox_list.append(chk) 18 self.check_states.append(bln)

投稿2021/01/26 04:57

編集2021/01/26 08:40
TakaiY

総合スコア13790

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

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

kumamon092

2021/01/26 05:52

アドバイスありがとうございます。 初心者で始めたばかりなので、ご無理を言いますが、その実装のプログラムを教えて頂けますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問