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

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

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

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

Python

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

Q&A

解決済

1回答

931閲覧

他のモジュールで作ったTkinterのラベル文字を変更したい

shinobuKouno

総合スコア31

Tkinter

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

Python

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

0グッド

0クリップ

投稿2023/02/16 05:19

実現したいこと

Python Tkinterで他のモジュールのクラス内で作ったラベルの文字を
他のモジュール内の関数でで変更したい
次のコードの例では
modul_b.pyの「class Label_Create」内で作ったラベル「lbl_a」の文字を
同じクラス内で作ったボタンを押し、modul_c内の「def change」の関数で変更したのですが、
どのように書いたら良いでしょうか?

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

AttributeError: type object 'Label_Create' has no attribute 'lbl_a'

該当のソースコード

modul_a.py

1import tkinter as tk 2import modul_b 3 4def main_screen(): 5 root = tk.Tk() 6 root.title("window") 7 root.geometry("600x600") 8 win = modul_b.Window(root)

modul_b.py

1import tkinter as tk 2import modul_a 3import modul_c 4 5class Window() 6 def __init__(self, master=None): 7 super().__init__(master) 8 self.grid(sticky="nsew") 9 self.create_widgets() 10 self.frm = tk.Frame(self).grid() 11 12 def lbl_cr(self): 13 lbl_cr = Label_Create(self.frm) 14 15class Label_Create(tk.Frame) 16 def __init__(self, master): 17 super().__init__(master) 18 self.grid(sticky="nsew") 19 lbl_a = tk.Label(self,text='').grid() 20 btn = tk.Button(self,text='ボタン',command=modul_c.change).grid()

modul_c.py

1import modul_b 2 3def change(): 4 modul_b.Label_Create. Label_Create.lbl_a["text"] = '文字が変わりました。'

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

Python 3.10

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

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

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

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

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

guest

回答1

0

ベストアンサー

貼り付けられたコードのインデントは意図通りですか?

タブとスペースが混在して意図しないインデントになってる場合があるので、
タブとスペースの区別ができるエディタで、インデントはスペース4つに統一しましょう。

python

1class Label_Create(tk.Frame) 2 def __init__(self, master): 3 super().__init__(master) 4 self.grid(sticky="nsew") 5 6 # v--- おそらくここのインデントが tab文字 になってます。 7 # インデントの改装が低い場合、__init__ 外なのでインスタンス(self) にはアクセスできません。 8 # また、 lbl_a はローカル変数なので、同じスコープ内でしか参照できません 9 # 外部から使いたい場合はインスタンス変数 self.lbl_a にします。 10 lbl_a = tk.Label(self,text='').grid() 11

modul_c の change に関しては、クラス属性とインスタンス属性の違いについて調べてください。


python

1 2 lbl_a = tk.Label(self,text='').grid() 3 btn = tk.Button(self,text='ボタン',command=modul_c.change).grid() 4

tkinter のレイアウトメソッドは戻り値がありません。
lbl_a btn はそれぞれ None になります。2行に分けて書きましょう。
1行で書いて良いのは戻り値を用いない場合のみです。


modul_b.Label_Create. Label_Create.lbl_a["text"]

  • Label_Create が2重になっている
  • Label_Create.lbl_a は Label_Create クラスに属する変数です。

 元コード側の間違いで、それに対応するコードを書こうとしています

python

1# modul_b 側 Label_Create __init__ 2 3from functools import partial 4lbl_a = tk.Label(self,text='') 5lbl_a.grid() 6tk.Button(self,text='ボタン',command=partial(modul_c.change, lbl_a)).grid() 7 8 9## modul_c 側 10def change(label): 11 label["text"] = ""

投稿2023/02/16 06:36

teamikl

総合スコア8664

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

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

shinobuKouno

2023/02/16 08:28

ありがとうございます。 インデント書き間違えでした。 とても勉強になりました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問