

入力された数値を画像表示させるプログラムを作っています。  
（例えば、987と入力したら9,8,7の画像がcanvas上に表示されます。)  
詳しくは、整数値(int)をstrにしてからリスト化。そのリストの1の位(list[-1]),10の位(list[-2])..を数字の画像と照合して合致したらその画像をcanvas上に表示するものです。表示はcreate_imageを使用し、それを変数に入れました。  
その時に、一番大きな位の数の画像を入れた変数が整数値になってしまいます。  
下のコードだと、実行後に[987]の百桁目'9'の画像を載せる変数:gz10にカーソルを置くと、整数値'2'が表示されてしまいます。どうすればよいのでしょうか。  
高校の課題で苦戦している初心者なので、わかりやすく教えて頂けたら幸いです  
（説明が甘くすみません、)  
※コードは見やすくするために、問題に関与する最低限のもののみ載せました。

[code]

    import tkinter as tk
    
    #ウィンドウとキャンバス
    root1 = tk.Tk()
    root1.geometry("800x600")
    canvas4 = tk.Canvas(root1, width = 800, height = 600)
    canvas4.create_rectangle(0, 0, 800, 600, fill = 'lightblue')
    canvas4.place(x=0, y=0)
    
    #画像を変数に入れる
    gazo1 = tk.PhotoImage(file="num_1.png",width=100,height=200)   
    gazo2 = tk.PhotoImage(file="num_2.png",width=100,height=200)
    gazo3 = tk.PhotoImage(file="num_3.png",width=100,height=200)
    gazo4 = tk.PhotoImage(file="num_4.png",width=100,height=200)
    gazo5 = tk.PhotoImage(file="num_5.png",width=100,height=200)
    gazo6 = tk.PhotoImage(file="num_6.png",width=100,height=200)
    gazo7 = tk.PhotoImage(file="num_7.png",width=100,height=200)
    gazo8 = tk.PhotoImage(file="num_8.png",width=100,height=200)
    gazo9 = tk.PhotoImage(file="num_9.png",width=100,height=200)
    gazo0 = tk.PhotoImage(file="num_0.png",width=100,height=200)
    
    fi=679　　　　　　　　　　　　　#入力値を679と仮定　
    fail=list(str(fi))　　　　　　#リスト化
    i = 1　
    #-i(=-1:一の位)の数が0なら0の画像を載せる。そうでなければ、、、を桁数分(i(1)~桁の数)繰り返す
    while i < len(fail)+1:
        if int(fail[-i]) == 0:　　　　　　　　
            gz0=canvas4.create_image(400, 300, image=gazo0, anchor=tk.CENTER)
            gz0.grid(column=str(i), row=0)
        elif int(fail[-i]) == 1:
            gz1=canvas4.create_image(400, 300, image=gazo1, anchor=tk.CENTER) 
            gz1.grid(column=str(i), row=0)
        elif int(fail[-i]) == 2:
            gz2=canvas4.create_image(400, 300, image=gazo2, anchor=tk.CENTER) 
            gz2.grid(column=str(i), row=0)
        elif int(fail[-i]) == 3:
            gz3=canvas4.create_image(400, 300, image=gazo3, anchor=tk.CENTER) 
            gz3.grid(column=str(i), row=0)
        elif int(fail[-i]) == 4:
            gz4=canvas4.create_image(400, 300, image=gazo4, anchor=tk.CENTER) 
            gz4.grid(column=str(i), row=0)
        elif int(fail[-i]) == 5:
            gz5=canvas4.create_image(400, 300, image=gazo5, anchor=tk.CENTER) 
            gz5.grid(column=str(i), row=0)
        elif int(fail[-i]) == 6:
            gz6=canvas4.create_image(400, 300, image=gazo6, anchor=tk.CENTER) 
            gz6.grid(column=str(i), row=0)
        elif int(fail[-i]) == 7:
            gz7=canvas4.create_image(400, 300, image=gazo7, anchor=tk.CENTER) 
            gz7.grid(column=str(i), row=0)
        elif int(fail[-i]) == 8:
            gz8=canvas4.create_image(400, 300, image=gazo8, anchor=tk.CENTER) 
            gz8.grid(column=str(i), row=0)
        elif int(fail[-i]) == 9:
            gz10=canvas4.create_image(400, 300, image=gazo9, anchor=tk.CENTER) 
            gz10.grid(column=str(i), row=0)　　　　　　　　　
             #↑ここが二つとも'2'と表示される
        i=i+1    　　　　　　　　　　　　　　　　　iを更新
    
    root1.mainloop()
    
[/code]


CC BY-SA 4.0
2023-02-24T16:07:31.153
93987
2023-02-25T04:44:17.240
57259
question
python
'int' object has no attribute 'grid'　というエラーが出て困っています。


> 'int' object has no attribute 'grid' というエラー

`create_image()` の戻り値が int 型のインスタンスだからです。以下のコードでは画像の表示位置を変更しています。(`grid()`
は使っていません)

[code]

    import tkinter as tk
    
    #ウィンドウとキャンバス
    root1 = tk.Tk()
    root1.geometry("800x600")
    canvas4 = tk.Canvas(root1, width = 800, height = 600)
    canvas4.create_rectangle(0, 0, 800, 600, fill = 'lightblue')
    canvas4.place(x=0, y=0)
    
    #画像を変数に入れる
    gazo = [tk.PhotoImage(file=f"num_{i}.png",width=100,height=200) for i in range(10)]
    
    fi = 679 #入力値を679と仮定
    fail = [*map(int, str(fi))] #リスト化
    
    canvas_width = int(canvas4['width'])
    img_width = gazo[0].width()
    x = (canvas_width - img_width * len(fail))//2
    y = 300
    for i in fail:
        canvas4.create_image(x, y, image=gazo[i], anchor=tk.W)
        x += img_width
    
    root1.mainloop()
    
[/code]

[![](https://i.stack.imgur.com/hI5Ik.png)](https://i.stack.imgur.com/hI5Ik.png)


CC BY-SA 4.0
2023-02-24T17:43:18.707
93988
2023-02-24T17:43:18.707
47127
93987
answer