質問内容
https://teratail.com/questions/163238
前の質問がこちらでコードを短くしようと試みておりましたが、関数を定義した際に新たに問題が起きました。
条件によって式の係数が変わるので予め、例えば30行目ではdef infect_Cattle(m)のように係数を定義して、条件によって0.75か0.25か変わるようにしておりました。
そして起動してみたのですが以下のエラーメッセージが出てきました。数字と数字を掛け合わせているはずなのにNoneTypeが出ていて困っています。これはどこが問題なのでしょうか?
コード
python3
1from tkinter import * 2import time 3import tkinter as tk 4import random 5import math 6#配列の宣言 7def array2(N1,N2): 8 return [[0 for j in range(N2)]for k in range(N1)] 9def array3(N1,N2,N3): 10 return [array2(N2,N3)for k in range(N1)] 11#セルの初期設定 12def initdt(): 13 A=array3(1000,31,31) 14 B=array3(1000,31,31) 15 for i in range(1,31): 16 for j in range(1,31): 17 if (i == 15 and j == 15): 18 A[0][i][j] = 1 19 B[0][i][j] = 1 20 else: 21 r_i=random.random() 22 if (r_i <= 0.5): 23 A[0][i][j] = 2 24 B[0][i][j] = 0 25 if (r_i > 0.5): 26 A[0][i][j] = 4 27 B[0][i][j] = 0 28 return A , B 29 30def infect_Cattle(m): 31 if m == 1 or m == 2: 32 return 0.75 33 if m == 3 or m == 4: 34 return 0.25 35 36def infect_Bear(m): 37 if m == 1 or m == 2: 38 return 0.10 39 if m == 3 or m == 4: 40 return 0.40 41 42#セルオートマトンの実行 43def execCell(A,B,i1): 44 i2 = 1 + i1 45 for i in range(1,30): 46 for j in range(1,30): 47 alpha = 0.50 48 a = 0.60 49 if A[i1][i][j] == 1: 50 B[i2][i][j] = (1 - alpha) * B[i1][i][j] 51 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 52 A[i2][i][j] = 2 53 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 54 A[i2][i][j] = 1 55 if A[i1][i][j] == 2: 56 B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1] 57 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 58 A[i2][i][j] = 2 59 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 60 A[i2][i][j] = 1 61 if B[i2][i][j] > 1.0: 62 A[i2][i][j] = 1 63 B[i2][i][j] = 1.0 64 if A[i1][i][j] == 3: 65 B[i2][i][j] = (1 - alpha) * B[i1][i][j] 66 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 67 A[i2][i][j] = 4 68 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 69 A[i2][i][j] = 3 70 if A[i1][i][j] == 4: 71 B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Bear(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Bear(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Bear(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Bear(A[i1][i][j+1]) * B[i1][i][j+1] 72 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 73 A[i2][i][j] = 4 74 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 75 A[i2][i][j] = 3 76 if B[i2][i][j] > 1.0: 77 A[i2][i][j] = 3 78 B[i2][i][j] = 1.0 79#セルの位置決めとIDの設定 80def drawCell(canvas,A,k): 81 x2=0 82 CID=array2(31,31) 83 for i in range(1,30): 84 x1=x2 85 x2=x1+20 86 y2=0 87 for j in range(1,30): 88 y1=y2 89 y2=y1+20 90 CID[i][j]=canvas.create_rectangle(x1,y1,x2,y2,fill='black') 91 return CID 92#セルの色設定 93def modifyCell(canvas,A,k,CID): 94 CL=['black','#ffffff','#ff0000','#ffffff','#0000ff'] 95 for i in range(1,30): 96 for j in range(1,30): 97 canvas.itemconfig(CID[i][j],fill=CL[A[k][i][j]]) 98 canvas.itemconfig(CID[i][j],outline=CL[A[k][i][j]]) 99#Tk初期設定 100def initTk(): 101 tk=Tk(); tk.title("2D Cell Automaton"); tk.resizable(0,0) 102 return tk 103#画面キャプチャ用 104def leftMouseDown(event): 105 global canvas, A,k,CID 106 modifyCell(canvas,A,k,CID) 107 execCell(A,B,k) 108#実行メイン 109A,B=initdt() 110root=initTk() 111canvas=Canvas(root,width=580,height=580,highlightthickness=0) 112canvas.pack() 113CID=drawCell(canvas,A,0) 114k=0 115 116def animate(): 117 global k 118 modifyCell(canvas, A, k, CID) 119 execCell(A,B,k) 120 k = 1 + k 121 root.after(1000, animate) 122 123root.after(1000, animate) 124root.mainloop()
エラーコード
Exception in Tkinter callback Traceback (most recent call last): File "C:\Python37\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:\Python37\lib\tkinter\__init__.py", line 749, in callit func(*args) File "2d_infect_alter.py", line 150, in animate execCell(A,B,k) File "2d_infect_alter.py", line 56, in execCell B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1] TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/11 15:48