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

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

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

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

Q&A

解決済

2回答

4662閲覧

python tkinterのモジュール化について

gorio

総合スコア17

Python 3.x

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

0グッド

0クリップ

投稿2018/12/10 07:12

前提・実現したいこと

Python Tkinterのentry boxをモジュール化します。
別のソースコードからモジュールを呼出してモジュール内の変数を使いたいのですがどのようにすればよいのか
わかりません。
教えていただけないでしょうか。

(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

以下はモジュール化する前の確認したソースコードです。
OKのボタンを押す毎にEntryboxの値がPrintされます。

モジュール化して他のソースコードにImportし、self.dateValue の変数を他のソースコードで使い、
同じようにprintで表示させたいのでが、GUIを表示する mainloop があるためか、
どうしてもOKのボタンを押しても表示させることができません。

こういった使い方をしたい場合はどのように書くべきか教えていだたけないでしょうか。

pyton

1import tkinter 2from tkinter import filedialog 3class Gui_18_v01(tkinter.LabelFrame): 4 5 def __init__(self,master=None): 6 super().__init__(master,bg="aquamarine", width=700, height=400) 7 self.pack() 8 x_width = 300 9 y_height = 60 10 11 self.dateValue = '' 12 13 #entry_Frame + OK_button 14 self.date_frame = tkinter.LabelFrame(master=None,text="DATE InPut",bg="lavender") 15 self.date_frame.place(x=0, y=0, width=x_width, height=y_height) 16 17 self.date_label = tkinter.Label(self.date_frame,text = "●",padx=10) 18 self.date_label.pack(side=tkinter.LEFT) 19 20 self.dateInfo = tkinter.StringVar() 21 22 self.dateInfo.set("17-05-11") 23 self.date_entry = tkinter.Entry(self.date_frame,width=25, 24 textvariable = self.dateInfo,justify='center') 25 self.date_entry.pack(side=tkinter.LEFT,padx=10) 26 27 self.datebtn = tkinter.Button(self.date_frame,text="OK",command=self.date_in,fg='blue') 28 self.datebtn.pack(side=tkinter.LEFT,padx=10) 29 30 def date_in(self): 31 self.dateValue = self.dateInfo.get() 32 print(self.dateValue) 33# return(self.dateValue) 34 35 36if __name__=='__main__': 37 root_frame = tkinter.Tk() 38 app = Gui_18_v01(master=root_frame) 39# print(app.date_in()) 40 app.mainloop() 41

試したこと

Classの継承を使うと何とか実現することができましたが、別の不明な問題が発生しより分からなくなりました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

普通にやるならGui_18_v01クラスをimportして、メインループはimportしたプログラムの側でしかるべく書くと思います。

python

1import tkinter 2from filename import Gui_18_v01 3 4# やりたいことを書く 5 6def main(): 7 # やりたいことを書く 8 root_frame = tkinter.Tk() 9 app = Gui_18_v01(master=root_frame) 10 # やりたいことを書く 11 app.mainloop() 12 13if __name__=='__main__': 14 main()

投稿2018/12/10 12:23

hayataka2049

総合スコア30933

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

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

gorio

2018/12/11 02:08

ご回答ありがとうございます。 確認してみました。結果は思いどうりにうごきませんでした。 import tkinter from module_sample01 import Gui_18_v01 # やりたいことを書く def main(): # やりたいことを書く root_frame = tkinter.Tk() app = Gui_18_v01(master=root_frame) # やりたいことを書く print(dateValue) #<-追加 app.mainloop() if __name__=='__main__': main() 結果は、NameError: name 'dateValue' is not defined のErrorとなり上位のクラスの変数を取り込むことができませんでした。 また、変数を使わず、” やりたいことを書く”のところに単に print("test")を書いてみたのですがOKのボタンを押しても表示される動作はしませんでした。 何か良い方法等はございませんでしょうか。
hayataka2049

2018/12/12 22:14 編集

まず、値そのものはインスタンス変数なので、app.dataValue等としてアクセスする必要があります。 ただ、メインループとの兼ね合いがあるので、やりたいことを書くの部分に書いてもダメそうですね。 Gui_18_v01をrootにしないで、他のフレームに埋め込むとかして使えばなんとかなりそうです。 ややこしいので、Gui_18_v01をcallbackを受け取る仕様にした方が楽といえば楽です。
gorio

2018/12/14 02:02

ご回答いただきありがとうございました。 Callbackで作成したことが無く、勉強したいと思います。 貴重なご意見を頂け大変助かりました。
guest

0

おはようございます。

問題文読ませていただきました。

こんな感じでいかがでしょうか?

python

1 2# main.py 3 4import tkinter 5from sub import Gui_18_v01 6 7if __name__ == '__main__': 8 root = tkinter.Tk() 9 10 app = Gui_18_v01(master=root) 11 12 # self.dateInfo.get()の値を取得する。 13 app.date_in() 14 15 # Windowをループさせて、継続的にWindow表示させる。 16 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/ 17 app.mainloop()

python

1 2# sub.py 3 4import tkinter 5 6 7class Gui_18_v01(tkinter.LabelFrame): 8 def date_in(self): 9 # entry Widgetの値を取得する。 10 print(self.dateInfo.get()) 11 12 def __init__(self, master=None): 13 # Windowの初期設定を行う。 14 # bg : 背景色の設定 15 # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/ 16 # width : 幅の設定 17 # height : 高さの設定 18 super().__init__(master, bg="aquamarine", width=700, height=400) 19 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/ 20 self.pack() 21 22 # Windowを親要素として、labelframe Widget(Frame)を作成する。 23 # text : テキスト情報 24 # bg : 背景色の設定 25 # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/ 26 # LabelFrameについて : https://kuroro.blog/python/ggEa100zNeLfl5nJg1iK/ 27 dateFrame = tkinter.LabelFrame( 28 master, text="DATE InPut", bg="lavender") 29 # Windowを親要素として、labelframe Widget(Frame)をどのように配置するのか? 30 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 31 dateFrame.place(x=0, y=0, width=400, height=60) 32 33 # labelframe Widget(Frame)を親要素として、label Widgetを作成する。 34 # text : テキスト情報 35 # padx : 文字列の外側(x軸方向)へ空白の幅を設定 36 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 37 label = tkinter.Label(dateFrame, text="●", padx=10) 38 # labelframe Widget(Frame)を親要素として、label Widgetをどのように配置するのか? 39 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/ 40 label.pack(side=tkinter.LEFT) 41 42 # テキストボックスへ初期値を設定する。 43 # StringVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/ 44 self.dateInfo = tkinter.StringVar() 45 self.dateInfo.set("17-05-11") 46 47 # labelframe Widget(Frame)を親要素として、entry Widgetを作成する。 48 # width : 幅の設定 49 # textvariable : テキストボックスの値を設定 50 # justify : 入力された文字列の配置を設定 51 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 52 entry = tkinter.Entry(dateFrame, width=25, 53 textvariable=self.dateInfo, justify='center') 54 # labelframe Widget(Frame)を親要素として、entry Widgetをどのように配置するのか? 55 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/ 56 entry.pack(side=tkinter.LEFT, padx=10) 57 58 # labelframe Widget(Frame)を親要素として、button Widgetを作成する。 59 # text : テキスト情報 60 # command : ボタンをクリックした時に、実行する関数を設定。self.date_inとする。 61 # fg : 文字色を設定。 62 # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/ 63 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/ 64 btn = tkinter.Button(dateFrame, text="OK", 65 command=self.date_in, fg='blue') 66 # labelframe Widget(Frame)を親要素として、button Widgetをどのように配置するのか? 67 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/ 68 btn.pack(side=tkinter.LEFT, padx=10)

ご確認のほど、よろしくお願いいたします。????‍♂️

投稿2021/06/15 23:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問