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

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

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

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

Tkinter

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

Q&A

解決済

2回答

6229閲覧

Pythonのサブウィンドウの値取得

jjkinder

総合スコア0

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2020/08/21 07:52

前提・実現したいこと

Python(GUI)の学習を始めたところです。
Toplevelで作成したサブウィンドウにComboboxを配置しました。
そのComboboxの値を取得したいのですが、エラーになってしまいます。
サブウィンドウ、Comboboxは正常に表示され、Comboboxを選択した時にエラーになります。

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

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Junichiro Hara\AppData\Local\Programs\Python\Python38\lib\tkinter_init_.py", line 1883, in call
return self.func(*args)
TypeError: get_bititem() missing 1 required positional argument: 'event'

該当のソースコード

import tkinter as tk
import tkinter.ttk as ttk
import sys
from tkinter.filedialog import askopenfilename
from tkinter import *

class mainwindow(tk.Frame):
def init(self,master=None):
super().init(master)
self.master.title("TEST") # ウィンドウタイトルの設定
self.master.geometry("600x600") # ウィンドウサイズの設定

self.pack() # メインフレームの配置 self.create_menu() # メニューの生成 # メニューの生成 def create_menu(self): # 設定ウィンドウを開く def winsetting(): settingwin=Toplevel(self) settingwin.title("SUB") settingwin.geometry("300x300") # modalに設定(このウィンドウが閉じるまではほかのウィンドウ操作をできなくする) settingwin.grab_set() # 部品の配置 label_bittype=tk.Label(settingwin,text="bit device Type") label_bittype.place(x=5,y=70) bit_type=ttk.Combobox(settingwin,values=("A","B","C","D","E"),state="readonly") bit_type.bind("<<ComboboxSelected>>",get_bititem) bit_type.place(x=100,y=70) # コンボボックスの値を取得(ここでエラーが発生します) def get_bititem(self,event): print(bit_type.get())   #メニューバーの作成 self.menubar=tk.Menu(self) # Menuクラスからmenubarインスタンスを生成 root.config(menu=self.menubar)# メニューバーの配置 self.setting_menu=tk.Menu(self.menubar,tearoff=0) #メニューバーに大項目"設定"を生成 self.menubar.add_cascade(label="設定",menu=self.setting_menu) # 大項目"設定"を設置 self.setting_menu.add_command(label="設定",command=winsetting) # 小項目"設定"を割り当て

if name == "main":
root=tk.Tk()
app=mainwindow(master=root)
app.mainloop()

試したこと

サブウィンドウをクラス化して見ようとトライしましたが、断念しました。

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

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

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

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

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

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

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

teamikl

2020/08/22 05:27

編集で「コードの挿入」を使って、ソースコードを掲載してください。 インデント等の重要な情報が失われて、 get_bititem() がクラスのメソッドなのか関数なのか、 判断が付き難く、どこまでがクラス内なのか不明瞭です。
guest

回答2

0

python

1# ※ インデントが不明の為推測です。 2 3 bit_type=ttk.Combobox(settingwin,values= ("A","B","C","D","E"),state="readonly") 4 bit_type.bind("<<ComboboxSelected>>", get_bititem) 5 bit_type.place(x=100,y=70) 6 7#コンボボックスの値を取得(ここでエラーが発生します) 8def get_bititem(self, event): 9 print(bit_type.get())

問題点: 関数get_bititem と 変数bit_type のスコープ

  • クラス内での宣言であれば、self を第一引数にしますが、

 bind では get_bititem となっているので、get_bititem は外に置かれた関数だと推測できます。

  • def get_bititem(event): にすれば引数のエラーはなくなりますが、

 問題解決には至らず、get_bititemは内部で使われている変数 bit_type にアクセスできる
場所で定義する必要があります。

解決策: 具体的にどうすれば良いかは、現状のコード次第ですが、1案としては

  • クラスを用いて get_bititem をクラス内のメソッド、

 bit_type をインスタンス変数にする

投稿2020/08/22 05:37

teamikl

総合スコア8664

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

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

0

自己解決

ご回答ありがとうございました。
何とか、解決いたしました。
変数、関数の定義、参照の場所がバラバラだったみたいです。
また初めてでしたので、質問の仕方(コードの挿入方法)もよくありませんでした。
皆様のご意見を参考にこれから理解を深めていこうと思います。

投稿2020/08/22 09:02

jjkinder

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問