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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

842閲覧

Classを一つのメソッドのようにして別のクラスで使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/11/07 10:47

前提・実現したいこと

Classを一つのメソッドのようにして別のクラスで扱いたいです。例えば、以下のようにプログラムするとします。FUNCTIONクラスで関数を色々定義して、それをしたのBTTNクラスの引数cmd=FUNCTIONクラスという風にしたいです。
回答よろしくお願いします。

該当のソースコード

python

1import tkinter as tk 2 3class App: 4 def __init__(self): 5 self.root = tk.Tk() 6 7 self.bttn = tk.Button(self.root).pack() 8 9 def mainloop(self): 10 self.root.mainloop() 11 12class FUNCTION(tk.Frame): 13 def __init__(self, root): 14 super(FUNCTION, self).__init__(root) 15 16 def Function1(): 17 18 def Function2(): 19 20class BTTN(tk.Frame): 21 def __init__(self, root): 22 super(BTTN, self).__init__(root) 23 self.root = root 24 25 def Btn2(x, y, text, cmd): 26 self.BtN = tk.Button(self.root, text = text, command = cmd) 27 self.BtN.place(x=x, y=y) 28 29 Btn2(0, 100, 'python', None) 30 Btn2(0, 200, 'C言語', None) 31 32def main(): 33 app = App() 34 app.mainloop() 35 36if __name__ == '__main__': 37 main() 38

試したこと

FUNCTIONクラスをインスタンス化して、BTTNクラスに継承させようとしましたが、うまくいきませんでした。

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

windows10 anacondaからspyderを使用 python3.8 tkinter

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラス自体を呼び出し可能にすることもできますが、
質問のケースでは、クラスのインスタンスが対象です。

__call__ メソッドを実装する事で、関数の様に呼び出す事が可能になります。
詳しくは、「呼び出し可能オブジェクト」について調べて見て下さい。


他の問題点

python

1 self.bttn = tk.Button(self.root).pack()

pack() は None を返すので、self.bttn は None になってます

python

1# OK: 戻り値が不要な場合 2tk.Button(eslf.root).pack() 3 4# 通常は別けて書く 5self.bttn = tk.Button(self.root) 6self.bttn.pack()

python

1 def Btn2(x, y, text, cmd): 2 self.BtN = tk.Button(self.root, text = text, command = cmd) 3 4 5 Btn2(0, 100, 'python', None) 6 Btn2(0, 200, 'C言語', None) 7 8 # self.BtN は 'C言語' ボタン

2回目の呼び出しで self.BtN を上書きしてます。

うまくいきませんでした。

どのようにうまくいかなかったのか、エラーがあるなら詳細を提示してください。
また、質問のコードには第三者の環境で実行し問題を再現できるものを提示してください。

以下は、不完全なコードですが
エラーが無いと省略されたのか、実行したコードなのかの判断が付きません。
実行したいコードが実行されてない可能性も出てきます。

python

1 2 def Function1(): 3 4 def Function2(): 5

投稿2021/11/08 04:13

teamikl

総合スコア8760

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

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

退会済みユーザー

退会済みユーザー

2021/11/08 07:19

後に提出する必要があったため、盗作疑惑を避けたくコードを省いてしまいました。すみません。???? 回答に感謝!!!
teamikl

2021/11/08 08:28

なるほど。全文掲載は不要ですが、省きすぎても、 問題解決に必要な情報迄省かれていることがあるので、そういった場合は 質問用に問題を再現するだけの最小限のコードを別に用意すると良いです。 回答では、質問の文章から、呼び出し可能オブジェクトに言及しましたが、 質問のコードにはFUNCTIONクラスを利用してる部分は書かれてなくて、 command=に渡される該当箇所には None が渡されているので、 どのように使われるのかなと疑問が残ってます。 補足で、Buttonのcommandに渡す部分 クラスの呼び出し ... コンストラクタの __init__ が呼ばれるが、 引数が一致しないのでエラー command=FUNCTION インスタンスの呼び出し ... __call__ が呼ばれる command=FUNCTION(self.root) >class FUNCTION(tk.Frame): Frame の継承は不要です。 pack/grid/place メソッドを呼び出さないと表示はされませんが、 内部ではウィジェットが生成されてます。
退会済みユーザー

退会済みユーザー

2021/11/11 05:28 編集

さらなる回答、ありがとうございます。m( _ _ )m 'どのように使われるのかなと疑問が残ってます。' >[Btn2(0, 100, 'python', FUNCTIONクラス)]としてボタンが押されたときにFUNCTIONクラスが実行されるようにするというのが、やりたかった事でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問