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

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

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

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

Python

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

Q&A

解決済

1回答

662閲覧

UIのボタン押下時にチェックボックスのチェック状態を取得してメソッドに引き渡したい

HekmatyarSmile

総合スコア6

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/09/01 07:20

目的:
UIを起動させて、Submit押下した際にチェックボタンのチェック状態を別のファイル「DoTask.py」doTaskメソッドに引き渡して処理を続けたい。しかしどう工夫しても何かしらのエラーが出てうまくいかない。

エラー:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Anaconda3\lib\tkinter_init_.py", line 1883, in call
return self.func(*args)
File "C:/Users/abc/PycharmProjects/pythonProject/menu1.py", line 56, in test
list_status = (v_1.get(), v_2.get(), v_3.get(), v_4.get(), v_5.get())
NameError: name 'v_1' is not defined

↓menu.py

python

1from tkinter import * 2from tkinter import ttk 3from DoTask import DoTask 4 5class Application(): 6 7 def create_menu(self): 8 root = Tk() 9 root.title("test) 10 11 frame = ttk.Frame(root, padding=1) 12 frame.grid() 13 14 15 v_1 = BooleanVar() 16 v_1.set(True) 17 cb_onProgress = ttk.Checkbutton(frame, padding=(10), text="1", variable=v_1) 18 cb_onProgress.grid(row=1,column=1) 19 20 v_2 = BooleanVar() 21 v_2.set(True) 22 cb_approved = ttk.Checkbutton(frame, padding=(10), text="2", variable=v_2) 23 cb_approved.grid(row=1,column=2) 24 25 v_3 = BooleanVar() 26 v_3.set(True) 27 cb_rejected = ttk.Checkbutton(frame, padding=(10), text="3", variable=v_3) 28 cb_rejected.grid(row=1,column=3) 29 30 v_4 = BooleanVar() 31 v_4.set(True) 32 cb_canceled = ttk.Checkbutton(frame, padding=(10), text="4", variable=v_4) 33 cb_canceled.grid(row=1,column=4) 34 35 v_5 = BooleanVar() 36 v_5.set(True) 37 cb_finished = ttk.Checkbutton(frame, padding=(10), text="5",variable=v_5) 38 cb_finished.grid(row=1,column=5) 39 40 button = ttk.Button(frame, text="submit", command=self.test) 41 # button.bind("<Button-1>", self.test) 42 button.grid(row=3,column=0) 43 root.mainloop() 44 45 46 def test(self): 47 global v_1 48 global v_2 49 global v_3 50 global v_4 51 global v_5 52 53 list_status = (v_1.get(), v_2.get(), v_3.get(), v_4.get(), v_5.get()) 54 DoTask.doTask(list_status) 55 56 57if __name__ == '__main__': 58 Application = Application() 59 Application.create_menu() 60 61

↓DoTask.py

python

1from selenium import webdriver 2from time import sleep 3import ast 4 5class DoTask(): 6 7 def doTask(self,list_status): 8 print(list_status)

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

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

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

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

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

guest

回答1

0

ベストアンサー

NameError: name 'v_1' is not defined

エラーの原因:
v_1 は create_menu() 内のローカル変数なので、create_menu 終了時に破棄されます。
test() 内でグローバル宣言してもアクセスできません。

グローバル変数にすると、クラスを再利用し難くなくなるので、
ここは双方とも、インスタンス変数 self.v1_1 にすることで解消できます。


他の問題点:

DoTask.doTask(list_status)

は、クラスメソッドの呼び出しなので、引数不一致で失敗します。

現状の doTask を呼び出すには、
DoTask().doTask(list_status) とインスタンスを生成する必要がありますが、
DoTaskクラスが特にデータを持たないのなら、スタティックメソッドや通常の関数にした方が良いです。

投稿2020/09/02 00:22

teamikl

総合スコア8760

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

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

HekmatyarSmile

2020/09/07 06:39

teamikl様のおっしゃる通りにコードを書き直したらうまく動きました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問