@Ryslynx

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonの質問です。

tkinterで大量のラベルを作る際に以下のことを試しました。

def label_maker(label_name,column,row)
exec(label_name) = tk.Label(root)
exec(label_name).grid(column=column,row=row)

for i in range(4)
for j in range(29)
temp = 'ml' + str(i) + str(j)
label_maker(temp,i,j)

execで文字列を変数として扱えるというのをみたので試してみましたが、
SyntaxError:cannot assign to function call here. Maybe you meant '==' instead of '='?
と出ました。

exec(label_name) = を==に変えて実行したところ

name 'ml00' is not definedが出ました。

試しに関数内のexecの前に

ml00 = tk.Label(root)
を書き加えて実行したところ

'NoneType' object has no attribute 'grid'

となり、お手上げ状態です。

ラベルを一気に作る方法はありますでしょうか?

0 likes

2Answer

特にPythonはインデントが命です。
まずは、下記サイトを参照して、コードブロックを正しく書き直してください。
(コードは部分ではなく、可能な限り全体を掲示してください)
投稿する前に、「プレビュー」を見て体裁等の崩れがないか確認するようにしましょう。

1Like

Comments

  1. インデント以外にも、defやforに:(コロン)も無いし、pythonの体を成して無いです。

    以下のコードで動きます。

    import tkinter as tk
    
    root = tk.Tk()
    
    exec = {}
    
    def label_maker(label_name, column, row):
        exec[label_name] = tk.Label(root, text=label_name)
        exec[label_name].grid(column=column, row=row)
    
    for i in range(4):
        for j in range(29):
            temp = 'ml' + str(i) + str(j)
            label_maker(temp, i, j)
    
    root.mainloop()
    
  2. @Ryslynx

    Questioner

    ご丁寧にありがとうございます。
    会社のPCで投稿できないため、手持ちのiPhoneで入力し、不恰好になりました。

@nak435 さんが回答しているように、辞書を変数辞書として使うのがいいですよ。
普通の変数もglobals()locals()などで参照できる変数辞書に格納されています。

>>> value = 123
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class'_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
 'value': 123}
>>> globals()['value']
123
>>> globals()['value'] = 456
>>> value
456

execを使ってうまくいかない理由を書きます。
exec(label_name)exec('ml00') などを実行し、変数名ml00を参照する処理なのでml00変数を探しますが、ml00変数は定義されていないのでエラーになります。
変数が定義されていたとしても exec('ml00')None を返すため、exec('ml00') = 123 のように代入すると None = 123 を実行したのと同じことになり、エラーになります。
exec('ml00 = 123)` のように引数の中に代入文を書けば変数に代入されます。

>>> exec('value = 789')
>>> value
789
0Like

Your answer might help someone💌