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

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

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

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

Python

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

Q&A

解決済

1回答

5706閲覧

tkinterのコードを複数のファイルに分割したい

ysyk77

総合スコア4

Tkinter

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

Python

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

0グッド

1クリップ

投稿2021/09/01 05:33

編集2021/09/02 23:54

前提・実現したいこと

tkinterでGUIを作成する時、機能が増えると分かりにくくなるので、機能に応じてソースをファイルしたいです。

具体的に、下のコードでは、タブが2つあります。
これをタブごとにソースファイルを作成したいです。

Pythonでは、どの様に記述するのが良いのでしょうか?

よろしくお願いします。

該当のソースコード

Python

1#!/usr/bin/python3 2# -*- coding: utf8 -*- 3import os, sys, time 4import tkinter as tk 5import tkinter.ttk as ttk 6 7class Application(tk.Frame): 8 def __init__(self, master=None): 9 super().__init__(master) 10 self.pack() 11 self.create_widgets() 12 return 13 14 def create_widgets(self): 15 nb = ttk.Notebook(self) 16 tab1 = tk.Frame(nb) 17 tab2 = tk.Frame(nb) 18 nb.add(tab1, text='tab1', padding=3) 19 nb.add(tab2, text='tab2', padding=3) 20 nb.pack(expand=1, fill='both') 21 self.create_tab1(tab1) 22 self.create_tab2(tab2) 23 24 # tab1 25 def create_tab1(self,tab1): 26 text1 = tk.StringVar() 27 text1.set("Tab1:Hello ") 28 label1 = tk.Label(tab1, textvariable = text1) 29 label1.pack() 30 btnTab1 = tk.Button(tab1) 31 btnTab1["text"] = "Test1" 32 btnTab1["command"] = self.btnTab_func 33 btnTab1["width"] = 12 34 btnTab1.pack() 35 return 36 37 # tab2 38 def create_tab2(self,tab2): 39 text2 = tk.StringVar() 40 text2.set("Tab2:Hello ") 41 label2 = tk.Label(tab2, textvariable = text2) 42 label2.pack() 43 btnTab2 = tk.Button(tab2) 44 btnTab2["text"] = "Test2" 45 btnTab2["command"] = self.btnTab_func 46 btnTab2["width"] = 12 47 btnTab2.pack() 48 49 # callback 50 def btnTab_func(self): 51 print("Tab button Push ") 52 return 53 54 55# メイン関数 56def main(): 57 # Windowの生成 58 root = tk.Tk() 59 root.geometry("200x100") 60 root.title(u"Test") 61 app = Application(master=root) 62 app.mainloop() 63 pass 64 65if __name__ == '__main__': 66 main() 67

試したこと

create_tab1()、create_tab2()を別ファイルにして、動作をさせることが出来ましたが、labelの内容を書換る為にウィジェット変数にアクセス出来ませんでした。

#【追記】自分で分割したソース
TestTab.py、mtab1.py、mtab2.pyの3つに分割しました。

該当のソースコード

メイン:TestTab.py

Python

1#!/usr/bin/python3 2# -*- coding: utf8 -*- 3import tkinter as tk 4import tkinter.ttk as ttk 5import mtab1 6import mtab2 7 8 9class Application(tk.Frame): 10 def __init__(self, master=None): 11 super().__init__(master) 12 self.pack() 13 self.create_widgets() 14 return 15 16 def create_widgets(self): 17 nb = ttk.Notebook(self) 18 tab1 = tk.Frame(nb) 19 tab2 = tk.Frame(nb) 20 nb.add(tab1, text='tab1', padding=3) 21 nb.add(tab2, text='tab2', padding=3) 22 nb.pack(expand=1, fill='both') 23 mtab1.create_tab1(self,tab1) 24 mtab2.create_tab2(self,tab2) 25 26 27# メイン関数 28def main(): 29 root = tk.Tk() 30 root.geometry("200x100") 31 root.title(u"Tab Test") 32 app = Application(master=root) 33 app.mainloop() 34 pass 35 36if __name__ == '__main__': 37 main()

mtab1.py
関係ないところ省略

Python

1# tab1 2def create_tab1(self,tab1): 3 text1 = tk.StringVar() 4 text1.set("Tab1:Hello ") 5 label1 = tk.Label(tab1, textvariable = text1) 6 label1.pack() 7 btnTab1 = tk.Button(tab1) 8 btnTab1["text"] = "Test" 9 btnTab1["command"] = btnTab1_func 10 btnTab1["width"] = 12 11 btnTab1.pack() 12 return 13 14 15 16# callback 17def btnTab1_func(): 18 text1.set("Tab1:goodbye ") 19 print("Tab1 button Push ") 20 return 21

mtab2.py
関係ないところ省略

Python

1# tab2 2def create_tab2(self,tab2): 3 text2 = tk.StringVar() 4 text2.set("Tab2:Hello ") 5 label2 = tk.Label(tab2, textvariable = text2) 6 label2.pack() 7 btnTab2 = tk.Button(tab2) 8 btnTab2["text"] = "Test" 9 btnTab2["command"] = btnTab2_func 10 btnTab2["width"] = 12 11 btnTab2.pack() 12 13 14# callback 15def btnTab2_func(): 16 text2.set("Tab2:goodbye ") 17 print("Tab2 button Push ") 18 return

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

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

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

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

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

guest

回答1

0

ベストアンサー

create_tab1はクラスメソッドですが、C#などとは異なりPythonではclassを複数ファイルに分割することはできません。
代わりに通常の関数として以下のように定義すると、別ファイルに配置できます。

Python

1def creatte_tab1(app,tab): 2 text = tk.StringVar() 3 # 略 4 btnTab["command"] = app.btnTab_func

ただ、今回の処理であれば、以下のように関数を共通化できます。

Python

1class Application(tk.Frame): 2 3 def create_widgets(self): 4 # 略 5 self.create_tab(tab1, 1) 6 self.create_tab(tab2, 2) 7 8 # tab 9 def create_tab(self, tab, no): 10 text = tk.StringVar() 11 text.set(f"Tab{no}:Hello ") 12 label = tk.Label(tab, textvariable = text) 13 label.pack() 14 btnTab = tk.Button(tab) 15 btnTab["text"] = f"Test{no}" 16 btnTab["command"] = self.btnTab_func 17 btnTab["width"] = 12 18 btnTab.pack()

投稿2021/09/01 06:34

can110

総合スコア38278

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

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

ysyk77

2021/09/02 23:57

ご回答、ありがとうございました。 自分で分割したコードを質問の所に追記しました。 このコードでも、ある程度は動作します。 このコードの問題点は、コールバック関数でラベルを変更しようとするとエラーになるところです。 具体的には、ウィジェット変数text1(text2)を参照できません。 コールバック関数btnTab1_func()、btnTab2_func()はクラスのメソッドでは無いのが原因かと考えています。 その為、根本的に分割の仕方の考えを間違えているのかと思い、質問させて頂きました。 コールバック関数から、ウィジェット変数text1(text2)を変更するにはどの様に記述するのが一般的なのでしょうか?
can110

2021/09/03 00:06

回答コードとご自身のコードをよく見比べてください。 コールバック関数はクラスメソッドを指定するようにしています。
ysyk77

2021/09/03 01:34

別ファイルにお教え頂いた関数を記載した時、呼び出し側では、appは何を渡せば良いでしょうか? appはメインで作成していますが、これを引数として渡せるのでしょうか?
can110

2021/09/03 03:57

selfを渡せばよいです。
ysyk77

2021/09/04 00:40

教えて頂いた内容をもとに、コールバック関数を呼び出せました。 ありがとうございました。 コールバック関数内でウィジェット変数text1、text2にアクセス出来ませんでした。 selfやtab1(tab2)などで、色々組み合わせを試して見ましたがダメでした。 色々試して、コールバック関数をラムダ式にしてウィジェット変数(text1 or text2)を引数にして渡すとアクセス出来ました。 btnTab1["command"] = lambda:btnTab1_func(text1)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問