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

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

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

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

Python

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

Q&A

解決済

1回答

2325閲覧

モジュール内部から、メインの関数を実行させたいです。

zundarakansu

総合スコア12

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/01/31 11:08

前提・実現したいこと

モジュール内部から、メインの関数を実行させたいです。
ウィンドウと黒いキャンバスを作成し、モジュールの関数を呼び出すボタン(module)を設けます。
次に、モジュールの関数が実行され、ボタン(button)が生成されます。
そのボタンを押したときに、メインの中にあるキャンバスを削除する関数(func)を呼び出させたいのですが、やり方がわかりません。

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

C:\python>main1.py Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) File "C:\python\module1.py", line 7, in push btn2["command"] = func NameError: name 'func' is not defined

該当のソースコード

Python

1**main.py** 2 3import tkinter 4import module1 5 6#キャンバス削除関数 7def func(): 8 canvas.delete("all") 9 10#ウィンドウ作成 11root = tkinter.Tk() 12root.minsize(900,460) 13#キャンパス作成 14canvas = tkinter.Canvas(width=900, height=460) 15canvas.place(x=0, y=0) 16canvas.create_rectangle(0,0,620,434,fill="black") 17 18#モジュール読み込み 19button2 = module1.Button2() 20 21#ボタン作成 22btn = tkinter.Button(text="module") 23btn.place(x=0, y=0) 24btn["command"] = button2.push 25 26root.mainloop() 27
**module1.py** import tkinter class Button2: def push(self): btn2 = tkinter.Button(text="button") btn2.place(x=100, y=0) btn2["command"] = func

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

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

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

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

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

guest

回答1

0

ベストアンサー

def func()model_common.pyに入れてはいかがですか?


python

1class Button2: 2 def __init__(self, func=None): 3 if func is not None: 4 self.func = func 5 def push(self): 6 btn2 = tkinter.Button(text="button") 7 btn2.place(x=100, y=0) 8 btn2["command"] = self.func

投稿2018/01/31 11:15

編集2018/01/31 11:38
mkgrei

総合スコア8560

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

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

zundarakansu

2018/01/31 11:31 編集

回答ありがとうございます。 model_common.py 自体はどのように扱えばいいでしょうか? module1にインポートするまでは分かったのですが、削除するcanvas自体がmainの内部にあるので、 ''' NameError: name 'canvas' is not defined ''' となってしまいます
mkgrei

2018/01/31 11:38

それならButton2をインスタンス化する時に関数を渡せばよいはずです。
zundarakansu

2018/01/31 11:58

解決しました。ありがとうございます! ***main.py import tkinter import module1 #キャンバス削除関数 def func(): canvas.delete("all") #ウィンドウ作成 root = tkinter.Tk() root.minsize(900,460) #キャンパス作成 canvas = tkinter.Canvas(width=900, height=460) canvas.place(x=0, y=0) canvas.create_rectangle(0,0,620,434,fill="black") #モジュール読み込み button2 = module1.Button2() #ボタン作成 btn = tkinter.Button(text="module") btn.place(x=0, y=0) btn["command"] = lambda : button2.push(func) root.mainloop() ***module1.py import tkinter class Button2: def push(self,func): btn2 = tkinter.Button(text="button") btn2.place(x=100, y=0) btn2["command"] = func
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問