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

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

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

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

Python

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

Q&A

解決済

1回答

946閲覧

tkinterのフォームを作成してエクセルに値を反映したい[python]

perochi

総合スコア5

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/03/10 06:51

前提・実現したいこと

python初心者です。
現在tkinterを使用してフォームに入力されたものをエクセルの指定したセルに反映させるコードを作成しています。
調べて出てきたコードを元に自分の使いたいようにコードを編集して作成しました。

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

指定のradiobuttonにチェックが入った時にそのvalueの値がvariableの変数に格納されません。
特にエラーコードは出力しないのですが、printの値や反映されたエクセルを確認してもradiobuttonの箇所のみ
初期値のまま「0」です。
どなたかご教授していただけると助かります。お願い致します。

該当のソースコード

wba = openpyxl.load_workbook(r'ファイル') wsa = wba.worksheets[0] ai = [] nyuryoku = [] class Application(tk.Frame): # Application(tk.Frame)をGUIとする def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("タイトル") # 実行内容 self.pack() # 自動サイズで配置 self.create_widget1() #def create_widget1(self):を実行 # create_widget1メソッドを定義 def create_widget1(self): # label1ウィジェット self.label1 = tk.Label(self,text="説明", padx = 50,font=("メイリオ", "18", "bold")) self.label1.pack(padx=5, pady=5) #x軸、y軸に5の余白を作りながら上記のLabelを配置 self.labelframe = tk.LabelFrame(self,text="接続状態",font=("メイリオ", "14")) f0 = self.labelframe v1 = tk.StringVar() v1.set("0") v2 = v1.get() self.radio = tk.Radiobutton(f0,value="切断中",variable=v1,text="切断中",font=("メイリオ", "14")) self.radio2 = tk.Radiobutton(f0,value="接続中",variable=v1,text="接続中",font=("メイリオ", "14")) self.labelframe.pack(side=tk.BOTTOM, padx=5, pady=5) self.check.grid(column=0,row=0,padx=5, pady=5) #ボタンの配置場所 self.radio2.grid(column=1,row=0,padx=5, pady=5) #ボタンの配置場所 # 各項目のlabelとentry items = ["発生日","発生時間","最小値", "最大値", "接続時間"] # itemsリストを定義 # button1が押された時に実行されるfetchメソッドを定義 def fetch(entries): # entriesリストの要素は(項目名, entryウィジェット)のタプルとなっている for entry in entries: # ループ開始 item = entry[0] # 項目名を取得 text = entry[1].get() # entryウィジェットの入力値を取得 ai.append(text) print('{}:{}'.format(item,text)) # 値をフォーマットして出力 hyouzi = '{}:{}'.format(item,text) nyuryoku.append(hyouzi) nyuryoku.append(v2) for i, name in enumerate(nyuryoku): wsa.cell(row=5+i, column=2).value = name wba.save(r'ファイル') print(ai) print(nyuryoku) # 各項目のlabelとentry def makeform(self, items): # 処理を呼び出せるようmakeform関数としてまとめる entries = [] # entriesリストを定義 for item in items: # ループ開始 row = tk.Frame(self) # 各項目のlabelとentryを囲むrowフレームを生成 label = tk.Label(row,text=item,font=("メイリオ", "16")) # 各項目のlabelを生成 entry = tk.Entry(row,font=("メイリオ", "16")) # 各項目のentryを生成 row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) # rowフレームを配置 label.pack(side=tk.LEFT) # labelウィジェットを配置 entry.pack(side=tk.RIGHT, fill=tk.X) # entryウィジェットを配置 entries.append((item, entry)) # 項目名と生成したentryウィジェットのタプルを1つの要素としてentriesリストに追加 return entries # entriesリストを返り値として返す ents = makeform(self, items) # ents変数を定義してmakeform関数を代入 self.button1 = tk.Button(self, text="確認",command=(lambda e=ents: fetch(e))) # ボタンが押されるとmakeform関数を実行してその返り値を使ってfetch関数を実行 self.button2 = tk.Button(self, text="終了", command=root.quit) self.button1.pack(side=tk.LEFT, padx=5, pady=5) #ボタンの配置場所 self.button2.pack(side=tk.LEFT, padx=5, pady=5) #ボタンの配置場所 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: StringVar の引数がローカル変数なので、
関数を抜けると破棄されてしまいます。

解決方法: インスタンス変数にする

  • self.v1 = tk.StringVar(...)
  • tk.Radiobutton(..., variable=self.v1)

投稿2021/03/10 07:24

teamikl

総合スコア8664

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

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

perochi

2021/03/11 08:58

ご指摘された箇所をコード修正したところ想定通り動作しました! 変数の扱いなどまだ勉強不足なので大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問